在学习<<UNIX程序设计>>的中信号处理的时候,我把书上的例子给写出来,并写出了一些自己的一些疑问:
1. 在第95行的时候,书上使用的是while(sigflag == 0),我想是不是使用if(sigflag == 0)是否也可以。
2.如果信号的动作是终止进程,则sigsuspend函数不返回。如果信号是动作的执行信号句柄,则在信号句柄返回后,sigsuspend函数返回。
代码如下:
- #include <signal.h>
- #include <iostream.h>
- #include <stdio.h>
- #include <sys/wait.h>
- static volatile sig_atomic_t sigflag;
- static sigset_t newmask,oldmask,zeromask;
- static void sig_usr(int);
- static void output(char*);
- static void WAIT_PARENT(void);
- static void TELL_WAIT(void);
- static void TELL_CHILD(pid_t);
- void pr_exit(int status)
- {
- int sig;
- if(WIFEXITED(status))
- cout<<"normal termination, exit status:"<<WEXITSTATUS(status)<<endl;
- else if(WIFSIGNALED(status))
- {
- sig = WTERMSIG(status);
- #ifdef WCOREDUMP
- cout<<"abnormal termination,signal number:"<<sig<<WCOREDUMP(status)?"(core file generated)":"";
- #else
- cout<<"abnormal termination,signal number:"<<sig;
- #endif
- }
- else if(WIFSTOPPED(status))
- {
- sig = WSTOPSIG(status);
- cout<<"child stopped,signal number:"<<sig<<endl;
- psignal(sig,"");
- }
- }
- #define MYSYNOPT 1
- int main(void)
- {
- pid_t pid;
- #ifdef MYSYNOPT
- TELL_WAIT();
- #endif
- if((pid = fork()) < 0)
- cout<<"fork error"<<endl;
- else if(pid == 0)
- {
- #ifdef MYSYNOPT
- WAIT_PARENT();
- #endif
- output("output from child/n");
- return 2;
- }
- else
- {
- output("output from parent/n");
- #ifdef MYSYNOPT
- TELL_CHILD(pid);
- #endif
- int status;
- waitpid(pid,&status,0);
- pr_exit(status);
- }
- return 1;
- }
- static void output(char* str)
- {
- char * ptr;
- int c;
- setbuf(stdout,NULL);
- for( ptr = str; c = *ptr++;)
- {
- sleep(1);
- putc(c,stdout);
- }
- }
- static void sig_usr(int signo)
- {
- sigflag = 1;
- return ;
- }
- void TELL_WAIT(void)
- {
- if(signal(SIGUSR1,sig_usr) == SIG_ERR)
- {
- cout<<"signal(SIGUSR1)error"<<endl;
- return ;
- }
- sigemptyset(&zeromask);
- sigemptyset(&newmask);
- sigaddset(&newmask,SIGUSR1);
- if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
- {
- cout<<"SIG_BLOCK_ERROR/n"<<endl;
- }
- }
- void WAIT_PARENT(void)
- {
- if(sigflag == 0)
- {
- cout<<"before sigsuspend()"<<endl;
- sigsuspend(&zeromask);
- cout<<"after sigsuspend()"<<endl;
- }
- sigflag = 0;
- if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0)
- cout<<"SIG_SETMASK error"<<endl;
- }
- void TELL_CHILD(pid_t pid)
- {
- kill(pid,SIGUSR1);
- }