当前位置: 技术问答>linux和unix
关于tcsetpgrp函数的问题
来源: 互联网 发布时间:2017-03-23
本文导语: 本帖最后由 nwcfafniw 于 2012-11-23 13:16:59 编辑 #include #include int main() { if(fork() == 0) { setpgid(0,getpid()); tcsetpgrp(0,getpid()); printf("After tcsetpgrp,the fore process group is %dn",(int)tcgetpgrp(0)); sleep(5); printf("I am child,process id...
#include
#include
int main()
{
if(fork() == 0)
{
setpgid(0,getpid());
tcsetpgrp(0,getpid());
printf("After tcsetpgrp,the fore process group is %dn",(int)tcgetpgrp(0));
sleep(5);
printf("I am child,process id is %d,process group id is %dn",getpid(),getpgrp());
}
else
{
sleep(5);
printf("I am father,process id is %d,process group id is %dn",getpid(),getpgrp());
}
return 0;
}
我先fork出一个子进程,然后改变子进程的进程组ID。经过测试,父进程所在的进程组才是前台进程组,但是我现在调用tcsetpgrp把子进程所在的进程组变成前台进程组,可是不知道为什么总是不成功(在sleep完成前键入CTRL+C,结果是没有任何输出),请问大家这是为什么。
ps:如果我把8、9行注释掉,在5s内键入CTRL+C,则只出现子进程的输出。
|
如果在关键地方打印一下前台进程组id就会更清楚了
int main()
{
pid_t pid;
printf("foreground pgid is %dn", tcgetpgrp(0));
if((pid = fork()) == 0)
//if(fork() == 0)
{
printf("foreground pgid is %dn", tcgetpgrp(0));
setpgid(0,getpid()); // 子进程新建了一个进程组,失去了控制终端,所以后面的tcsetpgrp会失败
// tcsetpgrp(0,getpid());
printf("After tcsetpgrp,the fore process group is %dn",(int)tcgetpgrp(0));
sleep(5);
printf("I am child,process id is %d,process group id is %dn",getpid(),getpgrp());
printf("foreground pgid is %dn", tcgetpgrp(0));
}
else
{
sleep(1);
printf("foreground pgid is %dn", tcgetpgrp(0));
tcsetpgrp(0, pid); // 父进程把控制终端让给子进程
printf("foreground pgid is %dn", tcgetpgrp(0));
sleep(5);
printf("I am father,process id is %d,process group id is %dn",getpid(),getpgrp());
}
return 0;
}
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。