23,120
社区成员
发帖
与我相关
我的任务
分享
(gdb) run test.c(gdb) bt
#0 0x00007ffff7a427e6 in __GI___sigsuspend (set=0x602260 <waitmask>) at ../sysdeps/unix/sysv/linux/sigsuspend.c:30
#1 0x000000000040160c in wait_child () at 10-61.c:156
#2 0x000000000040145c in main (argc=2, argv=0x7fffffffdcb8) at 10-61.c:76
119 static void sig_usr(int signo)
120 {
121 flag=1;
122 }
123
tell_wait()函数
125 void tell_wait(void)
126 {
127 signal(SIGUSR1,&sig_usr);
128 signal(SIGUSR2,&sig_usr);
129
130 sigemptyset(&oldmask);
131 sigemptyset(&newmask);
132 sigemptyset(&waitmask);
133
134 sigaddset(&newmask,SIGUSR1); //初始时屏蔽两个信号,父进程挂起时没有屏蔽
135 sigaddset(&newmask,SIGUSR2);
136
137 if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0){
138 err_sys("获取当前信号屏蔽字失败!\n");
139 }
140
//通知父进程SIGUSR1
145 void tell_parent(pid_t pid)
146 {
147 kill(pid,SIGUSR1);
148 }
//等待子进程运行结束
151 int wait_child(void)
152 {
153 //sigaddset(&waitmask,SIGUSR2);//屏蔽SIGUSR2
154 while(flag==0){
155 //pr_mask("父进程等待:");
156 if(sigsuspend(&waitmask)!=-1){
157 err_sys("sigsuspend error!\n");
158 }
159 }
160
161 parent_count++;
162 flag=0;
163
164 if(sigprocmask(SIG_SETMASK,&oldmask,NULL)==-1){
165 err_sys("恢复屏蔽字失败!\n");
166 }
167
168 return parent_count;
169 }
sigset_t mask;
sigfillset(&mask);
sigdelset(&mask, SIGUSR1);
if (sigprocmask(SIG_SETMASK, &mask, NULL) < 0) {
perror("sigprocmask()");
exit(EXIT_FAILURE);
}
sigsuspend(&mask);