新闻中心

EEPW首页>嵌入式系统>设计应用> 进程间通信之:信号

进程间通信之:信号

作者: 时间:2013-09-13 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/257126.htm

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>
#includesys/types.h>

函数原型

intkill(pid_tpid,intsig)

函数传入值

pid:

正数:要发送信号的进程号

0:信号被发送到所有和当前进程在同一个进程组的进程

-1:信号发给所有的进程表中的进程(除了进程号最大的进程外)

-1:信号发送给进程组号为-pid的每一个进程

sig:信号

函数返回值

成功:0

出错:-1

表8.8列出了raise()函数的语法要点。

表8.8 raise()函数语法要点

所需头文件

#includesignal.h>
#includesys/types.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教程


数字通信相关文章:数字通信原理


通信相关文章:通信原理




评论


相关推荐

技术专区

关闭