Дочерний процесс, создающий новый сеанс - PullRequest
4 голосов
/ 05 мая 2020

Я пытаюсь написать программу, которая создает дочерний процесс. Дочерний процесс создает новый сеанс. Также необходимо убедиться, что дочерний процесс стал лидером группы и что у него нет контрольного терминала.

Он всегда показывает мне waiting for parent to die, введено бесконечное l oop. Что мне нужно изменить, чтобы не отображать так?

это мой код:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {
    pid_t pid;

    if ((pid = fork()) < 0) {
        perror("fork error");
        return -1;
    } else
    if (pid == 0) {
        // Wait for the parent to die.
        while (getppid() != 1) {
            printf("Waiting for parent to die.\n");
            sleep(1);
        }

        pid = setsid();

        printf("pid, pgid and \"sid\" should be the same:\n");
        printf("pid: %d pgid: %d sid: %d\n", getpid(), getpgrp(), getsid(0));

        if ((open("/dev/tty", O_RDWR)) < 0) {
            printf("Child has no controlling terminal!\n");
        } else {
            printf("Child has a controlling terminal!\n");
        }

    } else {
        if ((open("/dev/tty", O_RDWR)) < 0) {
            printf("Parent has no controlling terminal!\n");
        } else {
            printf("Parent still has a controlling terminal!\n");
        }
        _exit(0);
    }
    return 0;
} 

1 Ответ

1 голос
/ 06 мая 2020

Проблема в том, что:

while (getppid() != 1) {
  printf("Waiting for parent to die.\n");
  sleep(1);
}

отклонение от курса всегда возвращает значение, отличное от 1. Для ожидания мертвого родительского процесса вы можете использовать wait (NULL), чтобы вы могли изменить блок которые я написал с помощью:

wait(NULL)

, когда я выполняю программу с этим изменением, я получаю следующий результат:

Parent still has a controlling terminal!
pid, pgid and "sid" should be the same:
pid: 2581 pgid: 2581 sid: 2581
Child has no controlling terminal!

Это то, что вам нужно?

...