免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3487 | 回复: 11
打印 上一主题 下一主题

请教一个进程间利用信号通信的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-10 16:51 |只看该作者 |倒序浏览
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void waiting(),stop();
int wait_mark;
main()
{
     int p1,p2;
     while((p1=fork())==-1);
     if(p1>0)
    {
             wait_mark=1;
             signal(SIGINT,stop);
             waiting();
             kill(p1,16);
             wait(0);
             printf("parent process is killed! \n");
             exit(0);
        }
        else
    {
             wait_mark=1;
             signal(16,stop);
             waiting();
         lockf(1,1,0);
         printf("child process  is killed by parent!\n");
         lockf(1,0,0);
             exit(0);
     }
}
void waiting()
{
        while(wait_mark!=0);
}
void stop()
{
        wait_mark=0;
}

这个程序的意思是通过系统调用fork()创建一个子进程,再用系统调用signal()让父进程捕捉键盘上的中断信号,当捕捉到中断信号后,父进程用系统调用kill()向子进程发出信号,子进程在捕捉到信号后,输出"child process  is killed by parent"后终止.可是实际的运行结果只是出现了"parent process is killed!"这句话,        child process  is killed by parent怎么也不出现.我怎么试都的不到正确的结果.哪位大侠能告诉我这是怎么回事啊?谢谢了.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-04-10 18:00 |只看该作者

  1. 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
  2. 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
  3. 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
  4. 13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
  5. 18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
  6. 22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
  7. 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
  8. 30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1
  9. 36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
  10. 40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9
  11. 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  12. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
  13. 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
  14. 56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
  15. 60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1
  16. 64) SIGRTMAX

复制代码

16号信号是什么?

论坛徽章:
0
3 [报告]
发表于 2006-04-10 19:12 |只看该作者
你的程序没有问题,关键在于你发SIGINT的方式,你用键盘发,你是指 Ctrl + C 吧?
这样的话,你的前台的进程组都会收到 SIGINT 的, 也就是说不只是 P1 , P2和P3也
同时收到了你用 Ctrl+ C 发的 SIGINT 信号。这导致了还没打印,程序已经被结束了。
你可以在运行程序以后 , 使用 ps -ef 查找你的P1的进程号,然后单独给P1发一个
信号 kill -2 pid-of-P1 ,就可以了

论坛徽章:
0
4 [报告]
发表于 2006-04-10 19:15 |只看该作者
我又做了一下修改
加了两句来忽略子进程接受SIGINT信号
现在用Ctrl+C就可以达到要求了

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void waiting();
void stop();
int wait_mark;

main(){
        int p1,p2;
        while((p1=fork())==-1);
        if(p1>0)
                {
                        while((p2=fork())==-1);
                        if(p2>0){
                                        wait_mark=1;
                                        signal(SIGINT,stop);
                                        waiting();
                                        kill(p1,16);
                                        kill(p2,17);
                                        wait(0);
                                        wait(0);
                                        printf("parent is killed!\n");
                                        exit(0);
                                        }
                        else{
                                                                 signal(SIGINT,SIG_IGN);
                                                                                wait_mark=1;
                                        signal(17,stop);
                                        waiting();
                                        lockf(stdout,1,0);
                                        printf("child 2 is killed by parent!\n");
                                        lockf(stdout,0,0);
                                        exit(0);
                                        }
                }
        else{
                             signal(SIGINT,SIG_IGN);
                                                wait_mark=1;
                        signal(16,stop);
                        waiting();
                        lockf(stdout,1,0);
                        printf("child process 1 is killed by parent!\n");
                        lockf(stdout,0,0);
                        exit(0);
                }
        }

void waiting(){
                while(wait_mark!=0);
                                }
void stop(){
                        wait_mark=0;
}

[ 本帖最后由 剑胆琴心 于 2006-4-10 19:19 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2006-04-11 15:05 |只看该作者

非常感谢

非常感谢剑胆琴心的热心相助。你说的原因我曾经也考虑到了,但是我没想出解决的办法。以后有机会还要向你多学习一下。

论坛徽章:
0
6 [报告]
发表于 2006-04-11 15:14 |只看该作者
SIGINT不是Ctrl+\么

论坛徽章:
0
7 [报告]
发表于 2006-04-11 15:55 |只看该作者
在Linux中,SIGINT的方式,若用键盘发,就是 Ctrl + C

论坛徽章:
0
8 [报告]
发表于 2006-04-11 16:20 |只看该作者
原帖由 abcxq 于 2006-4-11 15:55 发表
在Linux中,SIGINT的方式,若用键盘发,就是 Ctrl + C


Ctrl+C是SIGTERM啊, Ctrl+\才是SIGINT, 我就是说的Linux。 不信你写个程序打印一下

论坛徽章:
0
9 [报告]
发表于 2006-04-11 16:58 |只看该作者
我看了一下中文版的《Linux程序设计》(原书第2版)中,对SININT的说明是终端中断。而对SIGTERM来说是终止。对于我上面被剑胆琴心修改后的程序,如果用Ctrl+C能得到正确的结果。而用Ctrl+\显示退出。相对于SCO UNIX来说,终端中断是del键。

论坛徽章:
0
10 [报告]
发表于 2006-04-11 21:37 |只看该作者
把你子进程中写
signal(SIGINT,SIG_IGN);
的地方替换为setsid();
这样,父进程在收到ctrl+c后子进程就不会被殃及池鱼了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP