关于进程创建的问题

C、C++和Java语言
回复
头像
zenglei286
帖子: 12
注册时间: 2007-10-23 11:17
送出感谢: 0
接收感谢: 0

关于进程创建的问题

#1

帖子 zenglei286 » 2007-11-02 16:37

#include<stdio.h>

#include<signal.h>

#include<unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

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



int main( )

{
int p1,p2;

while((p1=fork())==-1);
if(p1==0)
{
wait_mark=1;
(void) signal(16,stop);
waiting();
lockf(stdout,1,0);
printf("Child process1 is killed by parent!");
lockf(stdout,0,0);
exit(0);
}
else
{
while ((p2=fork())==-1);
if (p2==0)
{
wait_mark=1;
(void) signal(17,stop);
waiting();
lockf(stdout,1,0);
printf("Child process1 is killed by parent!");
lockf(stdout,0,0);
exit(0);
}
else
{
wait_mark=1;
(void) signal(2,stop);

waiting( ); /*等待接收ctrl+c信号*/

kill(p1,SIGUSR1); /*向p1发出信号16*/

kill(p2,SIGUSR2); /*向p2发出信号17*/

/*同步*/

wait(0);

wait(0);

printf("parents is killed \n");

exit(0);
}
}

}
void stop(int sig)
{
wait_mark=0;
}
void waiting()
{
while(wait_mark!=0);
}
最后出来的是一按Ctrl+C程序就结束了,而且只打印出了parents is killed ,而且我查看了一下进程,发现子进程都有建立,就是没有运行,我用的是Ubunut6.06请大家帮个忙,找一下原因。
tengfei
帖子: 5
注册时间: 2007-01-27 23:17
来自: 中科院
送出感谢: 0
接收感谢: 0

解答

#2

帖子 tengfei » 2007-12-06 15:53

错误的原因在于按Ctrl-c时, 三个进程全部收到了SIGINT, 从而导致两个子进程退出. 这是由于三个进程同属一个 section 且 同属一个进程组. 当按下Ctrl-c时, 该section 的控制终端将向该section 的前端进程组的所有进程发送SIGINT. 而 shell在用通常方法启动程序时, 会通过 tcsetpgrp 将当前进程组设为前端进程组.

改正: 只要忽略两个子进程的SIGINT 即可.
将 signal(SIGINT, SIG_IGN) 加入两个子进程中.
回复

回到 “C/C++/Java”