QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2332|回复: 3

各位大侠进来帮小妹一个忙

[复制链接]
发表于 2004-12-14 14:17:03 | 显示全部楼层 |阅读模式
我写了一个linux进程间信号机制通信的实验
希望实现的功能:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:
Child process1 is killed by parent!
Child process2 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,stdout;
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 process is killed!\n");
exit(0);
}
else
{
wait_mark=1;
signal(17,stop);
printf("%d",SIG_DFL);
waiting();
lockf(stdout,1,0);
printf("child process 2 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);
printf("%d",SIG_DFL);
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;
}


我加大的那几行肯定是有问题的 signal(sig,fuction)
fuction肯定不可能指向stop ,按道理来说应该指向kill(我认为)
可是我不知道怎么修改这个程序,我是这方面的新手,希望得到哪位大侠的帮助,得到我期望的程序输出!
(按我这样的写法,父进程就直接kill掉了,根本没有对两个子进程发送信号。
执行时按下ctrl+c只是出现:parent process is killed!)
发表于 2004-12-16 13:29:19 | 显示全部楼层
别忙活了,这里没高手的,呵呵
回复

使用道具 举报

发表于 2004-12-21 16:38:54 | 显示全部楼层
我对编程不是很了解,但对源码中一些逻辑上的问题不太明白。


[code:1]                        while((p2=fork())==-1);
                                printf ("p2 is %d\n", p2);
                                if(p2>0) {
                                        wait_mark=1;
                                        signal(SIGINT,stop);
                                        waiting(); kill(p1,16);
                                        kill(p2,17);
                                        wait(0);
                                        wait(0);

                                        printf("parent process is killed!\n");
                                        exit(0);
                                } else {
。。。[/code:1]

p2=fork() 之后,p2 即为 p2 子进程的进程号,明显大于 0,此时执行 其后的 printf("parent process is killed!\n") 非常正常,
而两个子进程确实被 kill 了。

我不知道你是否是这个意思:

if (kill(p1,16) == 0) printf("child process 1 is killed by parent!\n");
if (kill(p2,17) == 0) printf("child process 2 is killed by parent!\n");

我依然不太理解你的意思,按你的表达代码应该已经达到了你 kill 掉两个子进程的目的,但是代码的逻辑上却输出了 parent process is killed! 罢了。
回复

使用道具 举报

发表于 2004-12-26 17:24:54 | 显示全部楼层
你在程序的最开始处加上
signal(SIGINT, SIG_IGN);
就可以了。
当你按Ctrl+C时两个子进程也收到了信号已经被干掉了,收不到16,17信号了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-20 09:54 , Processed in 0.078586 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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