📄 13.html
字号:
<html>
<head>
<title>Untitled Document</title>
</head>
<body>
<table width="100%">
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋体' size='2'><a name=linuxc242></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋体' size='2'> <br>
alarm(设置信号传送闹钟) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 相关函数 </font> </div>
</td>
<td> <font face='宋体' size='2'> signal,sleep<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 表头文件 </font> </div>
</td>
<td> <font face='宋体' size='2'> #include<unistd.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋体' size='2'> 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><br>
<font face='宋体' size='2'><a name=linuxc243></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋体' size='2'> <br>
kill(传送信号给指定的进程) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 相关函数 </font> </div>
</td>
<td> <font face='宋体' size='2'> raise,signal<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋体' size='2'> 执行成功则返回0,如果有错误则返回-1。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><br>
<font face='宋体' size='2'><a name=linuxc244></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋体' size='2'> <br>
pause(让进程暂停直到信号出现) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 相关函数 </font> </div>
</td>
<td> <font face='宋体' size='2'> kill,signal,sleep<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 表头文件 </font> </div>
</td>
<td> <font face='宋体' size='2'> #include<unistd.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 定义函数 </font> </div>
</td>
<td> <font face='宋体' size='2'> int pause(void);<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 函数说明 </font> </div>
</td>
<td> <font face='宋体' size='2'> pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋体' size='2'> 只返回-1。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 错误代码 </font> </div>
</td>
<td> <font face='宋体' size='2'> EINTR 有信号到达中断了此函数。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><br>
<font face='宋体' size='2'><a name=linuxc245></a></font> </div>
</td>
</tr>
<tr>
<td width="80" valign="top">
<div align="right"><font face='宋体' size='2'> <br>
</font> </div>
</td>
<td> <font face='宋体' size='2'> <br>
sigaction(查询或设置信号处理方式) </font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 表头文件 </font> </div>
</td>
<td> <font face='宋体' size='2'> #include<signal.h><br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 返回值 </font> </div>
</td>
<td> <font face='宋体' size='2'> 执行成功则返回0,如果有错误则返回-1。<br>
</font> </td>
</tr>
<tr>
<td width="80" valign="top">
<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 width="80" valign="top">
<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 width="80" valign="top">
<div align="right"><font face='宋体' size='2'> 执行 </font> </div>
</td>
<td> <font face='宋体' size='2'> sa_handler of signal 5 = Default action<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -