我的终端的文件描述符是什么

我的终端的文件描述符是什么

我需要使用tcsetgrp函数使我的后台进程变为前台进程,但是 的参数tcsetgrp是与我的终端关联的文件描述符。file descriptor我的终端或其 int 值是多少?

编辑

根据下面的评论,这是我的程序的片段。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
void sig_handler(int sig){

    printf("The grp get signal is  %d\n",tcgetpgrp(0));
}
int main(){

    printf("The controllling terminal is %d\n",tcgetpgrp(0));
    pid_t pid=fork();
    if(pid>0){
        signal(SIGINT,sig_handler);
        setpgid(pid,pid);
        tcsetpgrp(0,getpgid(pid));
        //tcsetpgrp(1,getpgid(pid));
        printf("Wait is over on %d",wait(NULL));
        tcsetpgrp(0,getpgid(getpid()));
        //tcsetpgrp(1,getpgid(getpid()));
        printf("The parent got control\n");
        while(1)
            //sleep(1);
            printf("Hello\n");

        return 0;
    }
    else{
        printf("The controllling terminal is %d\n",tcgetpgrp(0));
        printf("The controllling terminal is %d\n",tcgetpgrp(1));
        execlp("cat","cat",NULL);
    }
    return 0;

}

这里当前的 cat 程序是前台,一切工作正常。我可以从输入控制台读取数据并将其发送到输出控制台。但是当我按下*cntrl-c*我的前台进程(cat)终止但我的父母无法获得终端的控制权,即使我tcsetpgrp(0,getpid())在后面提到过wait()。我的 shell 提示符出现,我的父进程仍然作为后台进程

答案1

在您的程序中,默认情况下文件描述符 0 (stdin)、1 (stdout) 和 2 (stderr) 将与终端关联,除非您在用于调用程序的命令中使用重定向或管道。

答案2

有几种方法可以获取文件描述符:

  • 你可以运行类似的东西:lsof -p $$ | grep /dev/pts或者
  • ls /proc/$$/fd

文件描述符 0 (stdin)、1 (stdout) 和 2 (stderr) 都是所有程序使用的标准 FD。

相关内容