Почему клиент получает только дочерний вывод, когда сервер выполняет программу с вилкой? - PullRequest
0 голосов
/ 26 января 2019

У меня есть сервер на C, использующий соединение через сокет DGRAM и соответствующий клиент.

При подключении клиента сервер выполняет следующую программу:

#include<stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    int status;
    printf("Hello from parent\n");
    pid_t pr;

    if(pr = fork()>0)
    {
        wait(&status);
        return 0;
    }
    execv( "Path/to/child/child", 0);
    return 0;

}

Поведение, которое я не понимаю, таково: ответ, отправленный клиенту, является отпечатками дочернего процесса, родительский вывод кажется полностью обойденным. Чтобы быть более понятным, я ожидал, что клиент получит от сервера сообщение:

Hello from parent
Hello from child

пока клиент получает только

Hello from child

Обратите внимание, что при запуске с терминала выводятся как родительский, так и дочерний выходы.

Однако, если я полностью удаляю блок fork(), клиент получит вывод родителя (в этом случае дочерний элемент даже не существует):

Hello from parent

Почему в первом случае клиент получает только дочерний вывод, а не родительский?

Дочерний вывод может быть любым, например, я использовал это (C):

#include<stdio.h>
int main(int argc, char *argv[])
{
    printf("Hello from child\n");
    return 0;

}

Серверные и клиентские коды можно найти здесь (код слишком длинный для размещения здесь): файлы connectionlessClient.c и connectionlessServer.c и могут быть скомпилированы с помощью make (если вы можете запустить непосредственно исполняемые файлы). Просто измените программу, которая будет выполняться на сервере: строка для изменения:

if ((fp = popen("...", "r")) == NULL)
...