C中的分叉和PID

时间:2015-10-30 20:15:42

标签: c sockets fork pid child-process

我发现这个C练习有些困难:我被要求创建一个服务器套接字,它从输入流中读取(通过无限循环)一个字符串。如果字符串显示为“self”,则服务器在输出流上打印服务器自己的pid。如果它读取“fork”,则调用fork()函数并打印子节点的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());

我测试了它,当我只写一次“自我”或“分叉”时它实际上工作正常。如果我尝试多次发出“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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你需要在分叉后管理孩子。分叉后要做的第一件事是检查你是父母还是孩子的过程,然后根据你的位置做不同的事情。

在孩子身上:

  • 做任何你需要做的事,然后退出。根据您的描述,孩子可能不需要做任何事情,在这种情况下,它可以立即退出。

    如果你不退出,那么孩子将继续做与父母相同的事情。它将踩到其父母的脚趾,阅读父母的输入并弄乱其输出并造成其他类型的轻微破坏。

    建议使用_Exit()退出子进程,而不是exit()exit()将运行清理代码,例如刷新stdio缓冲区,你真的只希望父代运行。

在家长中:

  • 获取孩子的PID并打印出来。
  • 等待孩子退出wait()

    孩子应该立即退出,所以等待不应该长时间阻止。等待孩子确保孩子的过程得到清理,并且不会成为zombie process