포그라운드 프로세스 그룹에 하위 프로세스를 추가하려고 합니다. 분기 후에 execve()
는 새 프로세스 생성(이 경우 unix echo 프로그램)을 호출합니다 . 호출하기 전에 execve()
하위 프로세스의 pid를 사용하여 새 프로세스 그룹을 만들고 있습니다 . 그러므로 아이는 이 과정 집단의 과정 리더가 되어가고 있는 것이다. 그런 다음 tcsetpgrp()
프로세스 그룹 추가를 전경 프로세스 그룹에 호출합니다.
프로그램을 실행하면 tcsetpgrp()
통화가 중단됩니다. execve()
실행되지 않았습니다. tcsetpgrp()
호출을 제거하면 execve()
실행이 성공합니다.
왜 이런 일이 발생하는지 이해할 수 없습니다. 내가 작성한 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void pr_ids(char *name){
pid_t pid, ppid, pgid, tpgid;
pid = getpid();
ppid = getppid();
pgid = getpgrp();
tpgid = tcgetpgrp(STDIN_FILENO);
printf("%s: pid = %d ppid = %d"
" pgid = %d tpgid = %d\n", name, pid, ppid, pgid, tpgid);
}
int main(int argc, char *argv[]){
pid_t pid;
int st;
char *args[] = {"/bin/echo", "hello", NULL};
pr_ids("parent");
if((pid = fork()) == 0){
setpgid(0, 0); // creates its own process group and becomes group leader
pr_ids("child");
pid_t cpgrp = getpgrp();
tcsetpgrp(STDIN_FILENO, cpgrp); // add the process group to foreground
pr_ids("child");
execve(args[0], args, NULL);
}
else if(pid > 0){
waitpid(pid, &st, 0);
}
exit(0);
}
답변1
tcsetpgrp()
프로세스 그룹에 프로세스를 추가하는 대신 터미널의 포그라운드 프로세스 그룹을 설정합니다. 백그라운드 프로세스 그룹에서 호출 되면 tcsetpgrp()
호출 프로세스(및 해당 프로세스 그룹의 모든 프로세스)는 SIGTTOU
커널로부터 신호를 받아 잡히지 않는 한 중지합니다.
이것이 바로 귀하의 예에서 일어나는 일입니다. 다른 프로세스 그룹을 생성한 다음 tcsetpgrp()
그 그룹에서 호출하는 것입니다.