?? linux 常用c函數(中文版)-信號處理.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0051)http://net.pku.edu.cn/~yhf/linux_c/function/13.html -->
<HTML><HEAD><TITLE>Untitled Document</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2462.0" name=GENERATOR></HEAD>
<BODY>
<TABLE width="100%">
<TBODY>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc242></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>alarm(設置信號傳送鬧鐘) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>signal,sleep<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>unsigned int alarm(unsigned int
seconds);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>alarm()用來設置信號SIGALRM在經過參數seconds指定的秒數后傳送給目前的進程。如果參數seconds
為0,則之前設置的鬧鐘會被取消,并將剩下的時間返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>返回之前鬧鐘的剩余秒數,如果之前未設鬧鐘則返回0。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<unistd.h><BR>#include<signal.h><BR>void
handler() {<BR>printf(“hello\n”);<BR>}<BR>main()<BR>{<BR>int
i;<BR>signal(SIGALRM,handler);<BR>alarm(5);<BR>for(i=1;i<7;i++){<BR>printf(“sleep
%d ...\n”,i);<BR>sleep(1);<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>sleep 1 ...<BR>sleep 2 ...<BR>sleep 3
...<BR>sleep 4 ...<BR>sleep 5 ...<BR>hello<BR>sleep 6 ...<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc243></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>kill(傳送信號給指定的進程) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>raise,signal<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<sys/types.h><BR>#include<signal.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int kill(pid_t pid,int sig);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>kill()可以用來送參數sig指定的信號給參數pid指定的進程。參數pid有幾種情況:<BR>pid>0
將信號傳給進程識別碼為pid 的進程。<BR>pid=0 將信號傳給和目前進程相同進程組的所有進程<BR>pid=-1
將信號廣播傳送給系統內所有的進程<BR>pid<0
將信號傳給進程組識別碼為pid絕對值的所有進程<BR>參數sig代表的信號編號可參考附錄D<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>執行成功則返回0,如果有錯誤則返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EINVAL 參數sig 不合法<BR>ESRCH 參數pid
所指定的進程或進程組不存在<BR>EPERM 權限不夠無法傳送信號給指定進程<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<unistd.h><BR>#include<signal.h><BR>#include<sys/types.h><BR>#include<sys/wait.h><BR>main()<BR>{<BR>pid_t
pid;<BR>int status;<BR>if(!(pid= fork())){<BR>printf(“Hi I am child
process!\n”);<BR>sleep(10);<BR>return;<BR>}<BR>else{<BR>printf(“send
signal to child process (%d) \n”,pid);<BR>sleep(1);<BR>kill(pid
,SIGABRT);<BR>wait(&status);<BR>if(WIFSIGNALED(status))<BR>printf(“chile
process receive signal %d\n”,WTERMSIG(status));<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>sen signal to child process(3170)<BR>Hi I am
child process!<BR>child process receive signal 6<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc244></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>pause(讓進程暫停直到信號出現) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>kill,signal,sleep<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<unistd.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int pause(void);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>pause()會令目前的進程暫停(進入睡眠狀態),直到被信號(signal)所中斷。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>只返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EINTR 有信號到達中斷了此函數。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc245></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>sigaction(查詢或設置信號處理方式) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>signal,sigprocmask,sigpending,sigsuspend<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<signal.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int sigaction(int signum,const struct sigaction
*act ,struct sigaction *oldact);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>sigaction()會依參數signum指定的信號編號來設置該信號的處理函數。參數signum可以指定SIGKILL和SIGSTOP以外的所有信號。<BR>如參數結構sigaction定義如下<BR>struct
sigaction<BR>{<BR>void (*sa_handler) (int);<BR>sigset_t sa_mask;<BR>int
sa_flags;<BR>void (*sa_restorer)
(void);<BR>}<BR>sa_handler此參數和signal()的參數handler相同,代表新的信號處理函數,其他意義請參考signal()。<BR>sa_mask
用來設置在處理該信號時暫時將sa_mask 指定的信號擱置。<BR>sa_restorer 此參數沒有使用。<BR>sa_flags
用來設置信號處理的其他相關操作,下列的數值可用。<BR>OR 運算(|)組合<BR>A_NOCLDSTOP :
如果參數signum為SIGCHLD,則當子進程暫停時并不會通知父進程<BR>SA_ONESHOT/SA_RESETHAND:當調用新的信號處理函數前,將此信號處理方式改為系統預設的方式。<BR>SA_RESTART:被信號中斷的系統調用會自行重啟<BR>SA_NOMASK/SA_NODEFER:在處理此信號未結束前不理會此信號的再次到來。<BR>如果參數oldact不是NULL指針,則原來的信號處理方式會由此結構sigaction
返回。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>執行成功則返回0,如果有錯誤則返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EINVAL 參數signum 不合法,
或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號<BR>EFAULT 參數act,oldact指針地址無法存取。<BR>EINTR
此調用被中斷<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>#include<unistd.h><BR>#include<signal.h><BR>void
show_handler(struct sigaction * act)<BR>{<BR>switch
(act->sa_flags)<BR>{<BR>case SIG_DFL:printf(“Default
action\n”);break;<BR>case SIG_IGN:printf(“Ignore the
signal\n”);break;<BR>default:
printf(“0x%x\n”,act->sa_handler);<BR>}<BR>}<BR>main()<BR>{<BR>int
i;<BR>struct sigaction act,oldact;<BR>act.sa_handler =
show_handler;<BR>act.sa_flags =
SA_ONESHOT|SA_NOMASK;<BR>sigaction(SIGUSR1,&act,&oldact);<BR>for(i=5;i<15;i++)<BR>{<BR>printf(“sa_handler
of signal %2d
=”.i);<BR>sigaction(i,NULL,&oldact);<BR>}<BR>}<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>sa_handler of signal 5 = Default
action<BR>sa_handler of signal 6= Default action<BR>sa_handler of signal 7
= Default action<BR>sa_handler of signal 8 = Default action<BR>sa_handler
of signal 9 = Default action<BR>sa_handler of signal 10 =
0x8048400<BR>sa_handler of signal 11 = Default action<BR>sa_handler of
signal 12 = Default action<BR>sa_handler of signal 13 = Default
action<BR>sa_handler of signal 14 = Default action<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc246></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>sigaddset(增加一個信號至信號集) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>sigemptyset,sigfillset,sigdelset,sigismember<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<signal.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int sigaddset(sigset_t *set,int
signum);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>sigaddset()用來將參數signum 代表的信號加入至參數set
信號集里。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>執行成功則返回0,如果有錯誤則返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EFAULT 參數set指針地址無法存取<BR>EINVAL
參數signum非合法的信號編號<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋體 size=2><A
name=linuxc247></A></FONT></DIV></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD>
<TD><FONT face=宋體 size=2><BR>sigdelset(從信號集里刪除一個信號) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>sigemptyset,sigfillset,sigaddset,sigismember<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>#include<signal.h><BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>int sigdelset(sigset_t * set,int
signum);<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD>
<TD><FONT face=宋體
size=2>sigdelset()用來將參數signum代表的信號從參數set信號集里刪除。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>執行成功則返回0,如果有錯誤則返回-1。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD>
<TD><FONT face=宋體 size=2>EFAULT 參數set指針地址無法存取<BR>EINVAL
參數signum非合法的信號編號<BR></FONT></TD></TR>
<TR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -