Chinaunix
标题:
为什么父进程在为子进程改变进程组ID时,子进程收到了SIGHUP信号昵?
[打印本页]
作者:
DIYBYPERL
时间:
2012-11-09 11:27
标题:
为什么父进程在为子进程改变进程组ID时,子进程收到了SIGHUP信号昵?
本帖最后由 DIYBYPERL 于 2012-11-09 12:51 编辑
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
void signHand(int sign)
{
printf("pid[%d]sign[%d] received----YHB\n", getpid(), sign);
if (sign == SIGHUP )
{
printf("register SIGTTIN\n");
if( signal(SIGTTIN, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
}
}
//if (sign == SIGCONT )
//{
// printf("register SIGCONT\n");
// if( signal(SIGCONT, signHand) == SIG_ERR)
// {
// printf("Cant register SIG\n");
// }
//}
}
int main()
{
setbuf(stdout,NULL);
printf("main: %d %d\n", getpid(), getpgrp());
pid_t pid = fork();
if(pid <0){
perror("fork");
return 1;
}
setpgid(pid,0);
if(pid >0){
printf("parent begin to 10 seconds\n");
sleep(10);
printf("parent let child come back\n");
//------------>为什么父进程在为子进程改变进程组ID时,子进程收到了SIGHUP信号昵?
printf("setpgid[%d][%d][%s]\n", setpgid(pid, getpgrp()), errno, strerror(errno));
printf("parent begin to 20 seconds\n");
sleep(20);
printf("parent let child continue\n");
kill(pid, SIGCONT);
printf("parent wait child\n");
waitpid(pid,NULL,0);
printf("parent exit\n");
return 0;
}
char buf[1024];
printf("child: %d %d\n", getpid(), getpgrp());
if (signal(SIGHUP, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
return -1;
}
if (signal(SIGCONT, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
return -1;
}
while(fgets(buf,1024, stdin)){
printf("child.PID[%d].PGID[%d]>", getpid(), getpgrp());
fputs(buf, stdout);
}
printf("child exit\n");
return 0;
}
复制代码
编译后的文件为a
test:/home/test/testc>a
main: 30671002 30671002
child: 13369572 13369572
parent begin to 10 seconds
parent let child come back
setpgid[0][0][Error 0]
parent begin to 20 seconds
pid[13369572]sign[19] received----test
pid[13369572]sign[1] received----test
register SIGTTIN
12345555555555555555555555555555
child.PID[13369572].PGID[30671002]>12345555555555555555555555555555
parent let child continue
parent wait child
44444444444444444444444444444444444
child.PID[13369572].PGID[30671002]>44444444444444444444444444444444444
child exit
parent exit
test:/home/test/testc>
复制代码
请大侠解释下。。。。。。。。。。。。。。
环境是AIX 6.1
作者:
DIYBYPERL
时间:
2012-11-09 16:14
不能沉的。。。。。。
作者:
linux_c_py_php
时间:
2012-11-10 12:38
楼主AIX很神奇, 我表示怎么分析也分析不出来有理由SIGHUP, 因为子进程不在孤儿进程组里.
简单的注释了一下, 楼主再分析分析, 看有什么区别, 反正linux下是和楼主的结果不同:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
void signHand(int sign)
{
printf("pid[%d]sign[%d] received----YHB\n", getpid(), sign);
if (sign == SIGHUP )
{
printf("register SIGTTIN\n");
if( signal(SIGTTIN, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
}
}
}
int main()
{
setbuf(stdout,NULL);
printf("main: %d %d\n", getpid(), getpgrp());
pid_t pid = fork();
if(pid < 0) {
perror("fork");
return 1;
}
//父进程将子进程的组设置为子进程的pid, 也就是子进程新进入了一个进程组
//子进程执行这句毫无效果, 虽然和父进程执行有竞争, 但没有实际效果, 想到于setpgid(0, 0);
setpgid(pid, 0);
printf("pid=%d gid=%d cccc", getpid(), getpgrp());
if(pid >0) {
printf("parent begin to 10 seconds\n");
sleep(2);
printf("parent let child come back\n");
//父进程又把子进程恢复到父进程的进程组里
//但你要知道子进程此刻一定是进程组长, 一个进程组长离开了进程组而已, 并且父进程组也不是孤儿组, 没理由SIGHUP啊
printf("setpgid[%d][%d][%s]\n", setpgid(pid, getpgrp()), errno, strerror(errno));
printf("parent begin to 20 seconds\n");
sleep(2);
printf("parent let child continue\n");
kill(pid, SIGCONT);
printf("parent wait child\n");
waitpid(pid,NULL,0);
printf("parent exit\n");
return 0;
}
char buf[1024];
printf("child: %d %d\n", getpid(), getpgrp());
if (signal(SIGHUP, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
return -1;
}
if (signal(SIGCONT, signHand) == SIG_ERR)
{
printf("Cant register SIG\n");
return -1;
}
//这里你可以看到, 子进程的确又回到了父进程的组
while(fgets(buf,1024, stdin)){
printf("child.PID[%d].PGID[%d]>", getpid(), getpgrp());
fputs(buf, stdout);
}
printf("child exit\n");
return 0;
}
复制代码
作者:
DIYBYPERL
时间:
2012-11-12 09:20
回复
3#
linux_c_py_php
能把你执行的结果贴出来看看么?
我在AIX 执行了你的代码,还是收到了SIGHUP信号:
main: 28377192 28377192
pid=39452678 gid=39452678 ccccchild: 39452678 39452678
pid=28377192 gid=28377192 ccccparent begin to 10 seconds
parent let child come back
setpgid[0][0][Error 0]
parent begin to 20 seconds
pid[39452678]sign[19] received----YHB
pid[39452678]sign[1] received----YHB
register SIGTTIN
parent let child continue
parent wait child
dasfdf
child.PID[39452678].PGID[28377192]>dasfdf
dsafdf
child.PID[39452678].PGID[28377192]>dsafdf
dafds
child.PID[39452678].PGID[28377192]>dafds
child.PID[39452678].PGID[28377192]>
child exit
parent exit
复制代码
作者:
linux_c_py_php
时间:
2012-11-12 11:03
[root@vps616 c]# ./main
main: 27444 27444
pid=27444 gid=27444 ccccparent begin to 10 seconds
pid=27445 gid=27445 ccccchild: 27445 27445
parent let child come back
setpgid[0][0][Success]
parent begin to 20 seconds
parent let child continue
parent wait child
pid[27445]sign[18] received----YHB
作者:
DIYBYPERL
时间:
2012-11-12 12:52
回复
5#
linux_c_py_php
pid[27445]sign[18] received----YHB
18是LINUX下的SIGCONT信号吧?
奇怪的AIX!!!
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2