一步一步学Linux C:sigsuspend 进程阻塞
一步一步学Linux C:sigsuspend 进程阻塞
int sigsuspend(const sigset_t *sigmask);
此函数用于进程的挂起,sigmask指向一个信号集。当此函数被调用时,sigmask所指向的信号集中的信号将赋值给信号掩码。之后进程挂起。直到进程捕捉到信号,并调用处理函数返回时,函数sigsuspend返回。信号掩码恢复为信号调用前的值,同时将errno设为EINTR。进程结束信号可将其立即停止。
- #include <stdio.h>
- #include <signal.h>
- void checkset();
- void func();
- void main()
- {
- sigset_tblockset,oldblockset,zeroset,pendmask;
- printf("pid:%ld\n",(long)getpid());
- signal(SIGINT,func);
- sigemptyset(&blockset);
- sigemptyset(&zeroset);
- sigaddset(&blockset,SIGINT);
- sigprocmask(SIG_SETMASK,&blockset,&oldblockset);
- checkset();
- sigpending(&pendmask);
- if(sigismember(&pendmask,SIGINT))
- printf("SIGINTpending\n");
- if(sigsuspend(&zeroset)!= -1)
- {
- printf("sigsuspenderror\n");
- exit(0);
- }
- printf("afterreturn\n");
- sigprocmask(SIG_SETMASK,&oldblockset,NULL);
- printf("SIGINTunblocked\n");
- }
- void checkset()
- { sigset_tset;
- printf("checksetstart:\n");
- if(sigprocmask(0,NULL,&set)<0)
- {
- printf("checksetsigprocmask error!!\n");
- exit(0);
- }
- if(sigismember(&set,SIGINT))
- printf("sigint\n");
- if(sigismember(&set,SIGTSTP))
- printf("sigtstp\n");
- if(sigismember(&set,SIGTERM))
- printf("sigterm\n");
- printf("checksetend\n");
- }
- void func()
- {
- printf("hellofunc\n");
- }
评论暂时关闭