日期:2014-05-16  浏览次数:20806 次

linux fork 和signal 的问题
pid_t pid = fork();
if(pid == -1)
{
  perror("error!\n");
  exit(1);
}
else if(pid == 0)
{
  sleep(3);
  kill(getppid(),SIGALRM);
  exit(0);
}
printf("wait for 3s");
signal(SIGALRM,alrm);//alrm 是处理函数
pause();
printf("receive alarm");

1.创建进程后进程执行顺序是什么?能列举语句执行顺序吗?
2.子程序执行kill(getppid(),SIGALRM) 后是结束父进程,就是这个程序了吗?

谢谢。

------解决方案--------------------
1、没有明确的先后顺序。如果你依赖于这个顺序,必须自己采取某种同步机制
2、这个kill调用是给父进程发送SIGALRM信号
------解决方案--------------------
探讨

1、没有明确的先后顺序。如果你依赖于这个顺序,必须自己采取某种同步机制
2、这个kill调用是给父进程发送SIGALRM信号

------解决方案--------------------
父进程在fork之前就把signal/sigaction注册上SIGALRM, 或者在fork之前sigprocmask阻塞SIGALRM, 并且把pause语句换成sigsuspend来解除ALRM阻塞挂起等待SIGALRM信号唤醒,最好在sigsuspend挂起时阻塞除了ALRM外的所有信号,免得被其他信号唤醒,或者ALRM的信号处理函数设置个全局变量用于检查。
------解决方案--------------------
1.父进程和子进程是异步的,先后顺序不确定。
2.
探讨

父进程在fork之前就把signal/sigaction注册上SIGALRM, 或者在fork之前sigprocmask阻塞SIGALRM, 并且把pause语句换成sigsuspend来解除ALRM阻塞挂起等待SIGALRM信号唤醒,最好在sigsuspend挂起时阻塞除了ALRM外的所有信号,免得被其他信号唤醒,或者ALRM的信号处理函数设置个全局变量用于检查。