📄 13.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- saved from url=(0056)http://linux.tcpip.com.cn/~foolox/c_fun/function/13.html --><HTML><HEAD><TITLE>Untitled Document</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><META content="MSHTML 6.00.2900.2180" 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 + -