进程间通信之:信号
8.3.2信号发送与捕捉
发送信号的函数主要有kill()、raise()、alarm()以及pause(),下面就依次对其进行介绍。
1.kill()和raise()
(1)函数说明。
kill()函数同读者熟知的kill系统命令一样,可以发送信号给进程或进程组(实际上,kill系统命令只是kill()函数的一个用户接口)。这里需要注意的是,它不仅可以中止进程(实际上发出SIGKILL信号),也可以向进程发送其他信号。
与kill()函数所不同的是,raise()函数允许进程向自身发送信号。
(2)函数格式。
表8.7列出了kill()函数的语法要点。
表8.7 kill()函数语法要点
所需头文件 | #includesignal.h> | |
函数原型 | intkill(pid_tpid,intsig) | |
函数传入值 | pid: | 正数:要发送信号的进程号 |
0:信号被发送到所有和当前进程在同一个进程组的进程 | ||
-1:信号发给所有的进程表中的进程(除了进程号最大的进程外) | ||
-1:信号发送给进程组号为-pid的每一个进程 | ||
sig:信号 | ||
函数返回值 | 成功:0 | |
出错:-1 |
表8.8列出了raise()函数的语法要点。
表8.8 raise()函数语法要点
所需头文件 | #includesignal.h> |
函数原型 | intraise(intsig) |
函数传入值 | sig:信号 |
函数返回值 | 成功:0 |
出错:-1 |
(3)函数实例。
下面这个示例首先使用fork()创建了一个子进程,接着为了保证子进程不在父进程调用kill()之前退出,在子进程中使用raise()函数向自身发送SIGSTOP信号,使子进程暂停。接下来再在父进程中调用kill()向子进程发送信号,在该示例中使用的是SIGKILL,读者可以使用其他信号进行练习。
/*kill_raise.c*/
#includestdio.h>
#includestdlib.h>
#includesignal.h>
#includesys/types.h>
#includesys/wait.h>
intmain()
{
pid_tpid;
intret;
/*创建一子进程*/
if((pid=fork())0)
{
printf(Forkerrorn);
exit(1);
}
if(pid==0)
{
/*在子进程中使用raise()函数发出SIGSTOP信号,使子进程暂停*/
printf(Child(pid:%d)iswaitingforanysignaln,getpid());
raise(SIGSTOP);
exit(0);
}
else
{
/*在父进程中收集子进程发出的信号,并调用kill()函数进行相应的操作*/
if((waitpid(pid,NULL,WNOHANG))==0)
{
if((ret=kill(pid,SIGKILL))==0)
{
printf(Parentkill%dn,pid);
}
}
waitpid(pid,NULL,0);
exit(0);
}
}
该程序运行结果如下所示:
$./kill_raise
Child(pid:4877)iswaitingforanysignal
Parentkill4877
linux操作系统文章专题:linux操作系统详解(linux不再难懂)模拟信号相关文章:什么是模拟信号
linux相关文章:linux教程
数字通信相关文章:数字通信原理
通信相关文章:通信原理
评论