pause函數
?????? 調用該函數可以造成進程主動掛起,等待信號喚醒。調用該系統調用的進程將處于阻塞狀態(主動放棄cpu) 直到有信號遞達將其喚醒。
??? int pause(void);???? 返回值:-1 并設置errno為EINTR
?????? 返回值:
① 如果信號的默認處理動作是終止進程,則進程終止,pause函數么有機會返回。
????????????? ② 如果信號的默認處理動作是忽略,進程繼續處于掛起狀態,pause函數不返回。
????????????? ③ 如果信號的處理動作是捕捉,則【調用完信號處理函數之后,pause返回-1】
????????????? ?? errno設置為EINTR,表示“被信號中斷”。想想我們還有哪個函數只有出錯返回值。
????????????? ④ pause收到的信號不能被屏蔽,如果被屏蔽,那么pause就不能被喚醒。
?
練習:使用pause和alarm來實現sleep函數。??????????????????????????????????????????????????????????? ?????? ?????? ?????? 【mysleep.c】
注意,unslept = alarm(0)的用法。
例如:睡覺,alarm(10)鬧鈴。??
正常: 10后鬧鈴將我喚醒,這時額外設置alarm(0)取消鬧鈴,不會出錯。
????????????? 異常: 5分鐘,被其他事物吵醒,alarm(0)取消鬧鈴防止打擾。
/*** pause.c ***/ #include<stdio.h> #include<errno.h> #include<unistd.h> #include<signal.h> #include<stdlib.h>void catch_sigalrm(int signo) {; }unsigned int mysleep(unsigned int seconds) {int ret;struct sigaction act,oldact;act.sa_handler = catch_sigalrm;sigemptyset(&act.sa_mask);act.sa_flags = 0;ret = sigaction(SIGALRM,&act,&oldact);if(-1 == ret){perror("sigaction error");exit(1);}alarm(seconds);ret = pause();if(-1 == ret && errno == EINTR){printf("pauses success\n");}ret =alarm(0);sigaction(SIGALRM,&oldact,NULL);return ret; }int main() {while(1){mysleep(3);printf("-----------\n");}return 0; }
?