为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 95
学习任务

沫颖 的学生作业:

代码 /* 1-10 信号的处理-课后练习 练习 创建两个子进程 A 与 B,给子进程 A 发送 SIGUSR1 信号, 子进程 B 发送 SIGUSR2 信号,子进程A的处理方式设置为默认,子进程B的处理方式为使用自定义处理函数,并打印接收的信号的字符串信息(使用strsignal() 函数) */ #include #include #include #include #include #include #include // 进程自定义处理函数 void do_sig_usr(int sig) { fprintf(stdout, "Received signal %s\n", strsignal(sig)); } int main() { // 进程id pid_t cpid; // 注册信号处理函数返回值 __sighandler_t sig_ret; // 注册信号自定义处理函数 sig_ret = signal(SIGUSR2, do_sig_usr); if (sig_ret == SIG_ERR) { perror("[ERROR signal() 1: ]"); exit(EXIT_FAILURE); } // 创建子进程 cpid = fork(); // fork失败 if (cpid == -1) { perror("[ERROR fork() 1: ]"); exit(EXIT_FAILURE); } else if (cpid == 0) // 子进程A { fprintf(stdout, "子进程A start, pid : %d\n", getpid()); // 等待信号唤醒 pause(); fprintf(stdout, "子进程A end, pid : %d\n", getpid()); exit(EXIT_SUCCESS); } else if (cpid > 0) { pid_t ccpid; // 创建子进程B ccpid = fork(); // fork失败 if (ccpid == -1) { perror("[ERROR fork() 2: ]"); exit(EXIT_FAILURE); } else if (ccpid == 0) // 子进程B { fprintf(stdout, "子进程B start, pid : %d\n", getpid()); // 等待信号唤醒 pause(); fprintf(stdout, "子进程B end, pid : %d\n", getpid()); exit(EXIT_SUCCESS); } else if (ccpid > 0) { // 先让子进程运行 sleep(1); // 父进程 fprintf(stdout, "父进程 start, pid : %d\n", getpid()); // 给子进程A发送SIGUSR1信号 kill(cpid, SIGUSR1); // 给子进程B发送SIGUSR2信号 kill(ccpid, SIGUSR2); // 等待子进程结束 wait(NULL); fprintf(stdout, "父进程 end, pid : %d\n", getpid()); exit(EXIT_SUCCESS); } } return 0; } 结果 felix@felixlinux:~/Desktop/Study/CProjects/imooc-embedded/Stage05/Week12/Class04$ gcc demo_4_10.c felix@felixlinux:~/Desktop/Study/CProjects/imooc-embedded/Stage05/Week12/Class04$ ./a.out 子进程A start, pid : 12805 子进程B start, pid : 12806 父进程 start, pid : 12804 Received signal User defined signal 2 子进程B end, pid : 12806 父进程 end, pid : 12804

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号