首页 > 解决方案 > 为什么不能跳出分叉很多子线程的while循环?

问题描述

在我的程序中,每次用户通过标准输入键入消息时,代码都会将其读入,并调用 fork() 来创建一个新的(子)进程。这个子进程使用服务器套接字发送数据(用户输入的消息)。

要结束客户端进程,我希望用户键入“退出”。此时,我希望我的代码退出 While(1) 循环,等待所有子进程完成处理(因此不留下孤立/僵尸进程)。然后在这一点上,当所有子进程都完成并退出时,我希望程序结束。

但是现在和我的代码如下所示,当用户键入“退出”时,虽然子进程成功终止,但循环重新开始。有谁知道我在代码中做错了什么?

int status = 0;
while (1) {

    // Read request from standard input
    printf("Enter a message: ");
    memset(out_buffer, 0, BUFFER_SIZE);
    fgets(out_buffer, BUFFER_SIZE - 1, stdin);
    out_buffer[strcspn(out_buffer, "\r\n")] = 0;

    // Spawn new process to handle new client
    if ((pid = fork()) == -1) {
        printf("[-]Error spawning child process for new client.\n");
        continue;
    }
    // Child process
    else if (pid == 0) {
        // ...
        if (input_status == -2) {
            printf("[-]Disconnected from server.\n");
            close(socket_fd);
            termination_call = 1;
            exit(0);
        }
    }

    if (termination_call == 1) {
        printf("[-]Client terminating...\n");
        break;
    }

}

// Wait for all child processes to exit
while ((wpid = wait(&status)) > 0);
return 0;

标签: cloopsconcurrencyfork

解决方案


您需要检查parent"quit"中的命令。

当你 fork 一个新进程时,它独立于父进程运行,并且它们之间不共享任何数据。

如果您想共享数据,请考虑线程。


推荐阅读