服务器在使用fork执行程序时,为什么客户端仅接收子输出?

时间:2019-01-26 19:09:06

标签: c server udp client fork

我有一个使用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.cconnectionlessServer.c,并且可以使用make进行编译(如果打开您可以直接运行可执行文件)。只需更改要在服务器中执行的程序:要更改的行是:

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

0 个答案:

没有答案