LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 857|回复: 5

怎么这个“软中断通信"的程序运行时出错了,谢谢

[复制链接]
发表于 2003-11-3 21:50:06 | 显示全部楼层 |阅读模式
谢谢。麻烦帮我看一下以下的程序那里错了:
我觉得好像那个signal()的函数没有发挥作用的样子。不明白的

编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让
父进程捕捉键盘上来的中断信号(即按Del键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
child process 1 is killed by parent!
child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止:
parent process is killed !

程序如下:

#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)
         {
                while((p2=fork())==-1);
                if(p2>0)
                {
                        wait_mark=1;
                        signal(SIGINT,stop); /*接收'Del'信号,并转stop*/
                        waiting();
                        kill(p1,16);
                        kill(p2,17);
                        wait(0);
                        wait(0);
                        printf("parent process is killed !\n");
                        exit(0);
                 }
                 else
                 {
                        wait_mark=1;
                        signal(17,stop);
                        waiting();
                        lockf(1,1,0);
                        printf("child process 2 is killed by parent!\n");
                        lockf(1,0,0);
                        exit(0);
                   }
           }
           else
           {
                   wait_mark=1;
                   signal(16,stop);
                   waiting();
                   lockf(1,1,0);
                   printf("child process 1 is killed by parent!\n");
                   lockf(1,0,0);
                   exit(0);
            }
}

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

void stop ()
{
            wait_mark=0;
}
 楼主| 发表于 2003-11-12 11:49:05 | 显示全部楼层
怎么没有人回答我的了,
发表于 2003-11-12 22:24:51 | 显示全部楼层
使用kill命令发送消息
 楼主| 发表于 2003-11-14 22:31:19 | 显示全部楼层
具体一点,谢谢
发表于 2003-11-15 15:07:49 | 显示全部楼层
在子进程中屏蔽掉SIGINT,否则子进程同样会收到SIGINT,然后退出

check:
sigemptyset
sigaddset
sigdelset
sigprocmask
发表于 2003-11-16 23:02:27 | 显示全部楼层
我按楼上说的编了这段程序,可为什么运行结果还是只显示parent is killed!?又是哪儿出问题了呢?
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
main ()
{       
        int p1,p2;
        void k() {}
        void c()
        {
                kill (p1,16);
                kill (p2,17);
        }
        void c1()
        {
                printf ("child 1 is killed!");
                exit (0);
        }
        void c2()
        {
                printf ("child 2 is killed!");
                exit (0);
        }
        if ((p1=fork())==-1)
        {
                printf ("fork error!");
        }
        if (p1>0)
        {
                if ((p2=fork())==-1)
                {
                        printf ("fork error!");
                }
                if (p2>0)
                {
                        signal (SIGINT,c);
                        wait (0);
                        wait (0);
                        printf ("parent is killed!");
                        exit (0);
                }
                else
                {
                        signal (SIGINT,k);//收到SIGINT后就转空操作
                        signal (17,c2);
                }
        }
        else
        {
                signal (SIGINT,k);
                signal (16,c1);
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表