第31题
填写标记代码行的意义,给出功能描述和前6行程序输出。
#include <unistd.h>
#include <signal.h>
int ntimes=0;
main(int argc, char *argv[]) {
int pid,ppid;
int p_action( ), c_action( );
signal(SIGUSR1 , p_action); #(1)
switch(pid=fork( )) { #(2)
case -1: perror("fork failed?);
exit(1);
case 0: signal(SIGUSR1,c_action);
ppid=getppid( );
for ( ; ; ) ;
default: {
for( ; ; ) {
pause;
sleep(1);
kill(pid,SIGUSR1); #(3)
}
}
}
}
p_action( ) {
printf("parent caught signal #%d\n",++ntimes);
}
c_action( ) {
printf("child caught signal #%d\n",++ntimes/*, ++ltimes*/);
int ppid;
ppid = getppid(); #(4)
kill(ppid, SIGUSR1);
sleep(3);
}
答:
#(1)在父进程中为信号SIGUSR1绑定函数p_action
#(2)创建子进程
#(3)向子进程发送信号SIGUSR1
#(4)获取父进程的PID4分
父进程无线循环向子进程发送信号,子进程收到信号后向父进程发送相同信号,父子进程之间各自记录全局变量的变化,结果如:
#1child caught signal
#1parent caught signal
#2child caught signal
#2parent caught signal
#3child caught signal
#4parent caught signal