那年,一步一步學linux c —sigsuspend 進程阻塞

來源:互聯網
上載者:User


本系列文章有muge0913編寫,轉載請註明出處:http://blog.csdn.net/muge0913/article/details/7334813


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");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.