我在这个 C 练习中发现了一些困难:我被要求创建一个服务器套接字,它(通过无限循环)从输入流中读取一个字符串。如果字符串为“self”,则服务器在输出流上打印服务器自己的 pid。如果它读取“fork”,它会调用 fork() 函数并打印 child 的 pid。 我正在考虑将这些行包含在 while 循环中
if (strcmp(val,"self")==0) sprintf(result,"%d\n",getpid());
else if (strcmp(val,"fork")==0){
pid = fork();
if (pid == 0) sprintf(result, "%d\n", getpid());
我测试了它,当我只写一次“self”或“fork”时它实际上工作正常。如果我多次尝试发出“fork”命令,它就会“卡住”,这意味着我必须重复该命令两到三次才能真正获得我需要的结果。
这是我所做的一个例子(我使用 telnet 来测试服务器):
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
self
4313
fork
4324
fork
fork
self
4313
fork
fork
fork
4327
fork
fork
fork
4328
有什么想法吗?
最佳答案
fork 后需要管理 child 。 fork 之后要做的第一件事是检查你是父进程还是子进程,然后根据你所在的位置做不同的事情。
在 child 身上:
做任何你需要做的,然后退出。根据您的描述, child 可能不需要做任何事情,在这种情况下它可以立即退出。
如果您不退出,则子进程将继续执行与父进程相同的操作。它会踩到它的 parent 的脚趾,读取 parent 的输入并弄乱它的输出并造成其他类型的轻微破坏。
建议使用
_Exit()
退出子进程,而不是exit()
。exit()
将运行清除代码,例如您实际上只希望父级运行的刷新 stdio 缓冲区。
在父级中:
- 获取 child 的 PID 并打印出来。
使用
wait()
等待子进程退出。child 应该立即退出,所以等待不应该阻塞太久。等待子进程确保子进程被清理并且不会变成 zombie process .
关于c - C 中的 fork 和 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33444228/