c - 为什么不能跳出分叉很多子线程的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;
解决方案
您需要检查parent"quit"
中的命令。
当你 fork 一个新进程时,它独立于父进程运行,并且它们之间不共享任何数据。
如果您想共享数据,请考虑线程。
推荐阅读
- javascript - 在 React 中使用状态的正确方法
- json - 如何解码为嵌入式结构?
- python-3.x - 使用 PySpark 中的 ImageSchema 应用主成分分析
- python - Azure SDK StorageAccountUpdateParameters
- powershell - 检查数据是否存在于少数服务器上的最佳方法
- scala - 如何获取案例类参数键值对?
- c# - c# Datatable - 它们可以被创建为读/写(不是只读的)吗?
- xml - 将字符串与以下元素兄弟匹配
- regex - AntDesign 验证版式可编辑文本
- node.js - 发送docusign可替换合同的最佳方式