У меня есть сервер на 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)