当前位置:  技术问答>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...

本帖最后由 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 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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3