int main(int argc, char ** argv) { //初始化两个信号集,一个只有usr1,一个只有usr2 sigemptyset(&t_sigset_usr); sigemptyset(&t_sigset_old); sigemptyset(&t_sigset_zero); sigaddset(&t_sigset_usr, SIGUSR1); sigaddset(&t_sigset_usr, SIGUSR2); //注册信号处理程序, signal(SIGUSR1, do_sig_usr); signal(SIGUSR2, do_sig_usr); //父进程阻塞usr信号 sigprocmask(SIG_SETMASK, &t_sigset_usr, NULL ); pid_t child_pid; //父进程fork一个子进程出来 child_pid = fork(); if (child_pid == 0) { //子进程,从2开始写 num = 2; //注册信号处理程序, signal(SIGUSR1, do_sig_usr); signal(SIGUSR2, do_sig_usr); //子进程阻塞usr信号 sigprocmask(SIG_SETMASK, &t_sigset_usr, NULL ); //子进程准备完毕,通知父进程去写 tell_parent(); while (1) { //始终等待父进程唤醒 wait_parent(); write_num_to_file(); tell_parent(); } } else { //父进程 while (1) { //始终等待子进程唤醒 wait_child(); write_num_to_file(); tell_child(child_pid); } } //子进程写入数据,并且告知父进程,然后投入睡眠,等待父进程唤醒 //父进程等待子进程 exit(0); }
int gpio_export(int pin) { if (write_num_to_file("/sys/class/gpio/export", pin)) { CATERR("Failed to open GPIO export for writing\n"); return -1; } return 0; }
int gpio_write(int pin, int val) { char path[256]; snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin); if (write_num_to_file(path, val)) { CATERR("Failed to open GPIO export for writing\n"); return -1; } return 0; }