日期:2014-05-16  浏览次数:20651 次

关于tcsetpgrp函数的问题
本帖最后由 nwcfafniw 于 2012-11-23 13:16:59 编辑

#include<stdio.h>
#include<unistd.h>
int main()
{
    if(fork() == 0)
    {
setpgid(0,getpid());
tcsetpgrp(0,getpid());
printf("After tcsetpgrp,the fore process group is %d\n",(int)tcgetpgrp(0));
sleep(5);
printf("I am child,process id is %d,process group id is %d\n",getpid(),getpgrp());
    }
    else
    {
sleep(5);
        printf("I am father,process id is %d,process group id is %d\n",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 %d\n", tcgetpgrp(0));
    if((pid = fork()) == 0)
    //if(fork() == 0)
    {
        printf("foreground pgid is %d\n", tcgetpgrp(0));
        setpgid(0,getpid()); // 子进程新建了一个进程组,失去了控制终端,所以后面的tcsetpgrp会失败

        // tcsetpgrp(0,getpid());
        printf("After tcsetpgrp,the fore process group is %d\n",(int)tcgetpgrp(0));
        sleep(5);
        printf("I am child,process id is %d,process group id is %d\n",getpid(),getpgrp());
        printf("foreground pgid is %d\n", tcgetpgrp(0));
    }
    else
    {
        sleep(1);
        printf("foreground pgid is %d\n", tcgetpgrp(0));
        tcsetpgrp(0, pid); // 父进程把控制终端让给子进程
        printf("foreground pgid is %d\n", tcgetpgrp(0));
        sleep(5);
        printf("I am father,process id is %d,process group id is %d\n",getpid(),getpgrp());
    }
    return 0;
}

------其他解决方案--------------------
看注释

#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid;

    if((pid = fork()) == 0)
    //if(fork() == 0)
    {
        setpgid(0,getpid()); // 子进程新建了一个进程组,失去了控制终端,所以后面的tcsetpgrp会失败

        // tcsetpgrp(0,ge