我有一个使用DGRAM套接字连接的C服务器和相应的客户端。
客户端连接后,服务器将执行以下程序:
#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;
}
可以找到服务器和客户端代码here(代码太长,无法在此处发布):文件分别为connectionlessClient.c
和connectionlessServer.c
,并且可以使用make进行编译(如果打开您可以直接运行可执行文件)。只需更改要在服务器中执行的程序:要更改的行是:
if ((fp = popen("...", "r")) == NULL)