- 论坛徽章:
- 1
|
回复 #3 lsupper 的帖子
我改为信号方式后,还是有问题,具体代码如下,程序运行的结果是有时子进程kill发出的消息能让父进程在pause后被唤醒,正确实现了父子进程同步的要求,如下显示:
-----------------------------------------
[admin@localhost signal]$ ./synsignal
child is going to send a signal.
in parent, begin to pause...
child is sleeping for 2 seconds.
signal is handled
parent wakes up now
-----------------------------------------
但是大多数情况下都是如下显示信息, 没有达到预期结果,父进程一直处于pause状态。是否有可行的其他办法让子进程通知父进程可以继续执行呢?
-----------------------------------------------
[admin@localhost signal]$ ./synsignal
child is going to send a signal.
child is sleeping for 2 seconds.
signal is handled
in parent, begin to pause...
child is sleeping for 2 seconds.
child is sleeping for 2 seconds.
。。。
-----------------------------------------------
问题代码如下:
19 #include <unistd.h>
20 #include <signal.h>
21 #include <sys/types.h>
22 #include <sys/wait.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25
26 void sig_handler(int sig)
27 {
28 printf("signal is handled\n");
29 return;
30 }
31
32 int main()
33 {
34 pid_t pid;
35 (void)signal(SIGCONT, sig_handler);
36 pid=fork();
37
38 switch(pid){
39 case -1:
40 perror("fork error!");
41 exit(1);
42 case 0:
43 printf("child is going to send a signal.\n");
44 kill(getppid(), SIGCONT); // 向父进程发消息
45 while(1){ // 这里故意用了死循环让子进程不结束
46 printf("child is sleeping for 2 seconds.\n");
47 sleep(2);
48 /*kill(getppid(), SIGCONT);*/
49 };
50 default:
51 printf("in parent, begin to pause...\n");
52 pause(); // 此句执行前若已经处理了该signal,则没有办法再唤醒父进程了
53 printf("parent wakes up now\n");
54 break;
55 }
56 (void)signal(SIGCONT, SIG_DFL);
57 return 0;
58 }
[ 本帖最后由 jiufei19 于 2009-5-25 21:04 编辑 ] |
|