关于在父子进程中使用signal函数的问题

susuqiyu 2011-03-15 03:13:20
各位大侠,我在gcc中,编辑一个程序,源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

void handler(int signo)
{
switch(signo)
{
case SIGUSR1:
printf("parent: catch SIGUSR1\n");
break;
case SIGUSR2:
printf("child: catch SIGUSR2\n");
break;
default:
printf("should not be here\n");
break;
}
return;
}

int main(void)
{
pid_t ppid, cpid;

if(signal(SIGUSR1, handler) == SIG_ERR)
{
perror("can't set handler for SIGUSR1");
exit(1);
}

if(signal(SIGUSR2, handler) == SIG_ERR)
{
perror("can't set handler for SIGUSR2");
exit(1);
}

ppid = getpid();

if((cpid = fork()) < 0)
{
perror("fail to fork");
exit(1);
}
else if(cpid == 0)
{
if(kill(ppid, SIGUSR1) == -1)
{
perror("fail to send signal");
exit(1);
}

while(1);
}
else
{
sleep(1);

if(kill(cpid, SIGUSR2) == -1)
{
perror("fail to send signal");
exit(1);
}

printf("kill child\n");

if(kill(cpid, SIGKILL) == -1)
{
perror("fail to send signal");
exit(1);
}

if(wait(NULL) == -1)
{
perror("fail to wait");
exit(1);
}
}

return 0;
}

编译通过,但是,运行结果为:
parent : catch SIGUSR1
kill child

预期结果应是:
parent:catch SIGUSR1
child:catch SIGUSR2
kill child

请问究竟是哪里出了问题?谢谢赐教!
...全文
393 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
king_ven 2013-10-20
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <sys/types.h>

int main()
{
printf("nnnnnnnnnnnnn");

return 0;
}
susuqiyu 2011-03-19
  • 打赏
  • 举报
回复
哦,谢谢赐教啦!
susuqiyu 2011-03-19
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <sys/types.h>

int main()
{
printf("nnnnnnnnnnnnn");

return 0;
}
justkk 2011-03-17
  • 打赏
  • 举报
回复
点上面一排中带#按钮,选择C/C++
然后把你的代码插入【code=C/C++] 与【/code]之间
susuqiyu 2011-03-17
  • 打赏
  • 举报
回复
嗯哪,好了呢!谢谢你啊!不仅解决了问题,还讲解的很到位!感激不尽!
小弟再问一个低级的问题:你是怎么把程序原样粘贴到csdn上的?你看我粘贴的程序,是从Linux下通过共享到windows下,再用vc打开,通过复制粘贴到帖子上的。所以,每次我发帖提问都比较费时。呵呵!麻烦你了。很抱歉占用你的时间呢,已经让你帮我解决过几个问题了。
justkk 2011-03-17
  • 打赏
  • 举报
回复
父进程发送的信号太快了
先发送了一个SIGUSR2 信号,立马又发送了一个SIGKILL 信号
子进程来不及处理SIGUSR2 信号,就被SIGKILL 信号终止了
在两次发送信号之间添加一个sleep(1)就行了

子进程逻辑
    else if (cpid == 0)
{
ppid = getpid();
if (kill(ppid, SIGUSR1) == -1)
{
perror("fail to send signal");
exit(1);
}

while (1);
}


父进程逻辑,注意第二个sleep(1)
        sleep(1);

if (kill(cpid, SIGUSR2) == -1)
{
perror("fail to send signal");
exit(1);
}

printf("kill child\n");
sleep(1);

if (kill(cpid, SIGKILL) == -1)
{
perror("fail to send signal");
exit(1);
}
susuqiyu 2011-03-16
  • 打赏
  • 举报
回复
大哥,我也很穷,没有多少分给的。而且,也没有发过这样的贴啊!不过,倒是在一个QQ群里,问过别人,但是没有人解决,才过来这里求助的。
谢谢大哥回复我的帖子,送分给你,我也觉得值啊!
我按照你说的做了,还是不行。

从运行结果来说呢,好像是在父进程休眠之后,用kill向子进程发送的SIGUSR2信号没有被子进程接受。我在ppid = getpid(); 之后打印sleep后,又加了个printf打印出子进程ID(cpid)和父进程ID(ppid)。结果如下:

parent id printed in parent process: ppid = 2041

the child id printed in child process: cpid = 0

parent: catch SIGUSR1

the child id printed in parent process: cpid = 2042

kill child
看进程id的话,是父子进程关系。为什么不是预期输出结果?就不知道了。我有点怀疑是我的编译系统的问题。
谢谢大哥赐教!
能再帮我看看吗?
justkk 2011-03-15
  • 打赏
  • 举报
回复
楼主是在送分吗
之前发过一个完全一样的帖子了

ppid = getpid();
把这句话放在fork()之后的子进程中执行。。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧