首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

关于tcsetpgrp函数的有关问题

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

关于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,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
    {
        tcsetpgrp(0, pid); // 父进程把控制终端让给子进程
        sleep(5);
        printf("I am father,process id is %d,process group id is %d\n",getpid(),getpgrp());
    }
    return 0;
}


[其他解释]
引用:
如果在关键地方打印一下前台进程组id就会更清楚了
C/C++ code?1234567891011121314151617181920212223242526272829int main(){    pid_t pid;     printf("foreground pgid is %d\n", tcgetpgrp(0));    if((pid = fork()) =……

我以为只要是在同一个会话里面的进程都会拥有控制终端,或许现在我该理解成是前台进程组拥有控制终端,谢谢你的回答。
[其他解释]
一个回话可以有多个后台进程组和一个前台进程组。
APUE上有详细解释。
[其他解释]
该回复于2012-11-24 09:57:59被管理员删除

热点排行