Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65690
  • 博文数量: 52
  • 博客积分: 2065
  • 博客等级: 大尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-03 13:59
文章存档

2011年(1)

2010年(49)

2009年(2)

我的朋友

分类: 系统运维

2009-11-03 15:50:28

kill函数将信号发送给进程或者进程组。
 

int kill(pid_t pid, int signo);

• pid > 0 将信号发送给进程ID为pid的进程。
• pid == 0 将信号发送给其进程组ID等于发送进程的进程组ID,而且发送进程有许可权向
其发送信号的所有进程。
这里用的术语“所有进程”不包括实现定义的系统进程集。对于大多数U N I X系统,系统
进程集包括:交换进程(pid 0),init(pid 1)以及页精灵进程(pid 2)。
• pid < 0 将信号发送给其进程组ID等于pid绝对值,而且发送进程有许可权向其发送信号
的所有进程。如上所述一样,“所有进程”并不包括系统进程集中的进程。
• pid == -1 POSIX.1未定义此种情况。

不过上面的发送是有权限的,比如root就可以发送给任何一个进程或进程组,而非特权用户基本规则是发送者的实际或有效用户ID必须等于接收者的实际或有效用户ID。

一个特例:如果被发送的信号是SIGCONT,则进程可将它发送给属于同一对话期的任一其他进程。

如果signo参数是0,则kill仍执行正常的错误检查,但不发送信号。这常被用来确定一个特定进程是否仍旧存在。

raise函数则允许进程向自身发送信号。

int raise(int signo);
raise(signo)
等价于
kill(getpid(),signo);

alarm函数可以设置一个计时器,计时器超时时,产生SIGALRM信号。

unsigned int alarm(unsigned int seconds);

每个进程只能有一个闹钟时钟。

pause函数使调用进程挂起直至捕捉到一个信号。

int pause(void);

只有执行了一个信号处理程序并从其返回时,pause才返回。在这种情况下,pause返回-1,并将errno设置为EINTR。

实例:

(摘自论坛)

我写了一个程序,用fork产生了两个子进程,然后在父进程中使用signal函数等待SIGINT的发生,如果发生了,就向两个子进程中分别发送信号16和17,二两个子进程也等待这两个信号,一旦发生就分别显示两个字符串,然后用exit表示结束。父进程在两个子进程结束之后,也显示一个字符串,然后结束。

main()
{
int p1,p2;
wile((p1=fork())==-1);
if(p1==0)
{
signal(16,stop);
pause();
printf("p1 stop ");
exit(0);
}
else
{
wile((p2=fork())==-1);
if(p2==0)
{
signal(17,stop);
pause();
printf("p2 stop ");
exit(0);
}
else
{
signal(SIGINT,stop);
pause();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("parent stop ");
return 0;
}
}
}
void stop()
{
}

执行之后,应该由两个子进程打印的字符串都没有显示,只显示了父进程的字符串,为什么?我看书上说signal属于不可靠的信号,在心版本中已经不建议使用了,那么如果真的是这个问题,以我的程序为例,不可靠是如何产生的呢?

谢谢答复。

Cindy King

回答:
不是“不可靠”,而是“太可靠”(详见内)
是SIGINT的原因。
当用户按中断键时,终端驱动程序产生此信号并送至前台的进程组的每一个进程。
(W. Richard Stevens APUE)

因此,当输入中断键时,parent, p1, p2均收到此信号。
而p1, p2均对SIGINT按省缺处理----终止该进程。

要想按你的意图,只需添加两行代码,使p1, p2忽略SIGINT信号。
... ...
if (p1 == 0) {
signal(SIGINT, SIG_IGN); /* add this line */
signal(16,stop);
... ...

... ...
if (p2 == 0) {
signal(SIGINT, SIG_IGN); /* add this line */
signal(17,stop);
... ...
... ...

相关文章:

1:Linux 多线程应用中如何编写安全的信号处理函数

2: 如果信号处理函数中没有再次注册该处理函数,处理函数将仅执行一次。
  另外,signal函数是不是第一次执行的时候不管信号16是否到达,都要先执行一遍stop函数的?(应该不会吧?)  
  所以他也就不会在signal时执行   安装的函数
   #
阅读(470) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-12-18 23:19:14

这位兄弟,最近部门在内部推荐,机会较好,真诚希望你或者这里的朋友能关注下 ------------------------------------------------------------------------------------------ 全球TOP3通信公司创新项目招募人才(机会较好,待遇从优) 地点:上海   包括但不限于以下方面:(1)嵌入式技术和linux开发(2)编译环境开发(3)应用和业务软件开发(4)浏览器和互联网技术(5)媒体平台:媒体技术和算法(6)通信协议:传输,组网以及协议开发等   招聘范围:中高级技术专家,技术带头人,3年以上工作经验   待遇:从优,只要您有实力,待遇一切可谈   关于我们:提供一个良好的技术和开发环境,提供优越的个人发展空间通道以及完善的培训制度,个人配股激励计划。   若有任何疑问或者兴趣,欢迎邮件:BlankHt@163.com   静候您或者您的朋友回音。