我需要使用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。