当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 关于进程创建的问题
帖子发表于 : 2007-11-02 16:37 
头像

注册: 2007-10-23 11:17
帖子: 12
送出感谢: 0 次
接收感谢: 0 次
#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请大家帮个忙,找一下原因。


页首
 用户资料  
 
2 楼 
 文章标题 : 解答
帖子发表于 : 2007-12-06 15:53 

注册: 2007-01-27 23:17
帖子: 5
地址: 中科院
送出感谢: 0 次
接收感谢: 0 次
错误的原因在于按Ctrl-c时, 三个进程全部收到了SIGINT, 从而导致两个子进程退出. 这是由于三个进程同属一个 section 且 同属一个进程组. 当按下Ctrl-c时, 该section 的控制终端将向该section 的前端进程组的所有进程发送SIGINT. 而 shell在用通常方法启动程序时, 会通过 tcsetpgrp 将当前进程组设为前端进程组.

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


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译