📄 13.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.2800.1479" 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 + -