- 论坛徽章:
- 0
|
习题是:用信号实现父子进程同步.
为何子进程向父进程发送SIGUSER1信号后, 程序直接退出,而不能捕获呢?
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <signal.h>
- #include "err.h"
- void TELL_WAIT();
- void TELL_PARENT();
- void WAIT_PARENT();
- void TELL_CHILD();
- void WAIT_CHILD();
- void sig_usr(int);
- static volatile sig_atomic_t sigflag=0;
- static sigset_t newmask,oldmask,zeromask;
- int main(void)
- {
- FILE *fp;
- pid_t pid;
- char count='1';
- if((fp=fopen("/home/xiao/apue/test.txt","a+"))==NULL)
- err_sys("fopen err");
- if(fclose(fp)==-1)
- err_sys("close err");
- if(pid=fork()==-1)
- err_sys("fork err");
- TELL_WAIT();
- else if(pid==0){
-
- printf("i'm child:");
- fputc(count,fp);
- printf("\n");
- count++;
- printf("parent pid is %d\n",getppid());
- TELL_PARENT(getppid()); --用gdb调试到这边时,程序直接退出.信号SIGUSER1不能捕获
- WAIT_PARENT();
- exit(0);
- }
- printf("my pid is %d\n",getpid());
- WAIT_CHILD();
- printf("i'm PARENT:");
- fputc(count,fp);
- printf("\n");
- fflush(fp);
- TELL_CHILD(pid);
- exit(0);
- }
- void sig_usr(int signo){ --这个信号处理程序不能被执行
- sigflag=1;
- return;
- }
- void TELL_WAIT(void)
- {
- if(signal(SIGUSR1,sig_usr)==SIG_ERR)
- err_sys("signal(SIGUSR1) eror");
- if(signal(SIGUSR2,sig_usr)==SIG_ERR)
- err_sys("signal(SIGUSR2) error");
- sigemptyset(&newmask);
- sigemptyset(&zeromask);
- sigaddset(&newmask,SIGUSR1);
- sigaddset(&newmask,SIGUSR2);
- if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
- err_sys("SIG_BLOCK error");
- }
- void TELL_PARENT(pid_t pid)
- {
- kill(pid,SIGUSR2);
- }
- void WAIT_PARENT(void)
- {
- while(sigflag==0)
- sigsuspend(&zeromask);
- sigflag=0;
- if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
- err_sys("SIG_SETMASK error");
- }
- void TELL_CHILD(pid_t pid)
- {
- kill(pid,SIGUSR1);
- }
- void WAIT_CHILD(void)
- {
- while(sigflag==0)
- sigsuspend(&zeromask);
- sigflag=0;
- if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
- err_sys("SIG_SETMASK error");
- }
复制代码
[ 本帖最后由 打靶归来 于 2008-6-2 17:52 编辑 ] |
|