포그라운드 프로세스 그룹에 하위 프로세스를 추가할 수 없습니다.

포그라운드 프로세스 그룹에 하위 프로세스를 추가할 수 없습니다.

포그라운드 프로세스 그룹에 하위 프로세스를 추가하려고 합니다. 분기 후에 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()그 그룹에서 호출하는 것입니다.

관련 정보