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 프로그램이 전경이고 모든 것이 잘 작동하고 있습니다. 입력 콘솔에서 데이터를 읽고 이를 출력 콘솔로 보낼 수 있습니다. 그러나 내가 누르면 포그라운드 프로세스(cat)가 종료되지만 나중에 언급했음에도 *cntrl-c*
부모님은 터미널을 제어할 수 없습니다 . 내 쉘 프롬프트가 나타나고 상위 프로세스가 백그라운드 프로세스로 유지됩니다.tcsetpgrp(0,getpid())
wait()
답변1
프로그램에서 파일 설명자 0(stdin), 1(stdout) 및 2(stderr)는 프로그램을 호출하는 명령에서 리디렉션이나 파이프를 사용하지 않는 한 기본적으로 터미널과 연결됩니다.
답변2
파일 설명자를 얻는 방법에는 여러 가지가 있습니다.
- 다음과 같이 실행할 수 있습니다.
lsof -p $$ | grep /dev/pts
또는 ls /proc/$$/fd
파일 설명자 0(stdin), 1(stdout) 및 2(stderr)는 모든 프로그램에서 사용되는 표준 FD입니다.