Какой из этих двух способов использования `wait ()` и `exit ()` лучше? - PullRequest
0 голосов
/ 21 декабря 2018

Вот некоторые примеры использования wait() и exit(), которые я понимаю из https://github.com/karelzak/util-linux/blob/200769b6c0dff6863089ea2a9ff4ea9ccbd15d0f/login-utils/login.c#L939

f(){
    child_pid = fork();

    if (child_pid) { 
        // parent part
        ...
        while (wait(NULL) == -1 && errno == EINTR) ;
        ...
        exit();
    }

    // common part, which is actually child part
    ...
}

f();

// common part 2, which is actually child part
...

Это то же самое, что и это?

f(){
    child_pid = fork();

    if (child_pid) { 
        // parent part
        ...
        while (wait(NULL) == -1 && errno == EINTR) ;
        ...
        exit();
    }

    if (child_pid == 0) { 
        // common part, which is actually child part
        ...   

        // common part 2, which is actually child part
        ...         
    }
}

f();

Является ли второеодин легче понять, чем первый? Это то, что я чувствую (особенно приведенный выше код обернут в функцию, и вызов этой функции имеет другой общий код, следующий за ним в main()) , но я не очень много знаю об этом.

Есть ли причина или случай, когда первое лучше второго?В частности, почему реализация login (первая ссылка выше) выбрала первый путь?

1 Ответ

0 голосов
/ 21 декабря 2018

Это действительно вопрос того, что принадлежит внутри функции, которая несколько туманна.Но если ваша функция что-то типа «поместите меня в новый процесс, для которого определенным образом настроена среда», то имеет смысл, чтобы этот код имел такую ​​структуру:

void switch_to_child(){
    int pid = fork();
    if (pid < 0){
        exit_with_an_error();
    }
    if (pid > 0){
        wait_and_exit_in_parent();
    }
    set_up_child_environment();
}

initialize_stuff();
switch_to_child();
do_child_stuff();

Нас другой стороны, если ваша функция что-то вроде «порождает новый процесс, чтобы сделать что-то», имеет больше смысла для кода иметь такую ​​структуру:

void make_child(){
    int pid = fork();
    if (pid < 0){
        exit_with_an_error();
    }
    if (pid == 0){
        do_child_stuff();
        exit_in_child();
    }
}

initialize_stuff();
make_child();
wait_and_exit_in_parent();
...