C中的Forks和PIDs

C中的Forks和PIDs,c,sockets,fork,pid,child-process,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();

我在这个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());
我测试了它,当我只写一次“self”或“fork”时,它实际上工作得很好。如果我多次尝试发出“fork”命令,它就会“卡住”,这意味着我必须重复该命令两到三次,才能真正获得所需的结果

下面是我所做工作的示例(我使用telnet测试服务器):


有什么想法吗?

你需要在用叉子叉完后管理好孩子。分叉后要做的第一件事是检查您是父进程还是子进程,然后根据您所在的位置执行不同的操作

在子项中:

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

    如果您不退出,那么孩子将继续做与家长相同的事情。它会踩到父节点的脚,读取父节点的输入,弄乱输出,并造成其他类型的小破坏

    建议使用
    \u exit()
    退出子进程,而不是
    exit()
    exit()
    将运行清理代码,就像刷新stdio缓冲区一样,您实际上只希望父级运行这些代码

在父项中:

  • 获取孩子的PID并打印出来
  • 使用
    Wait()
    等待子项退出

    孩子应该马上离开,所以等待时间不应该太长。等待子进程可以确保子进程被清理,并且不会成为一个错误


    • 你需要在用叉子叉完后管理孩子。分叉后要做的第一件事是检查您是父进程还是子进程,然后根据您所在的位置执行不同的操作

      在子项中:

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

        如果您不退出,那么孩子将继续做与家长相同的事情。它会踩到父节点的脚,读取父节点的输入,弄乱输出,并造成其他类型的小破坏

        建议使用
        \u exit()
        退出子进程,而不是
        exit()
        exit()
        将运行清理代码,就像刷新stdio缓冲区一样,您实际上只希望父级运行这些代码

      在父项中:

      • 获取孩子的PID并打印出来
      • 使用
        Wait()
        等待子项退出

        孩子应该马上离开,所以等待时间不应该太长。等待子进程可以确保子进程被清理,并且不会成为一个错误


        • 你需要在用叉子叉完后管理孩子。分叉后要做的第一件事是检查您是父进程还是子进程,然后根据您所在的位置执行不同的操作

          在子项中:

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

            如果您不退出,那么孩子将继续做与家长相同的事情。它会踩到父节点的脚,读取父节点的输入,弄乱输出,并造成其他类型的小破坏

            建议使用
            \u exit()
            退出子进程,而不是
            exit()
            exit()
            将运行清理代码,就像刷新stdio缓冲区一样,您实际上只希望父级运行这些代码

          在父项中:

          • 获取孩子的PID并打印出来
          • 使用
            Wait()
            等待子项退出

            孩子应该马上离开,所以等待时间不应该太长。等待子进程可以确保子进程被清理,并且不会成为一个错误


            • 你需要在用叉子叉完后管理孩子。分叉后要做的第一件事是检查您是父进程还是子进程,然后根据您所在的位置执行不同的操作

              在子项中:

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

                如果您不退出,那么孩子将继续做与家长相同的事情。它会踩到父节点的脚,读取父节点的输入,弄乱输出,并造成其他类型的小破坏

                建议使用
                \u exit()
                退出子进程,而不是
                exit()
                exit()
                将运行清理代码,就像刷新stdio缓冲区一样,您实际上只希望父级运行这些代码

              在父项中:

              • 获取孩子的PID并打印出来
              • 使用
                Wait()
                等待子项退出

                孩子应该马上离开,所以等待时间不应该太长。等待子进程可以确保子进程被清理,并且不会成为一个错误


              我们需要查看
              fork
              代码的其余部分。你为什么在孩子身上输出?孩子在输出后做什么?请提供SSCCE:我们需要查看
              fork
              代码的其余部分。你为什么在孩子身上输出?孩子在输出后做什么?请提供SSCCE:我们需要查看
              fork
              代码的其余部分。你为什么在孩子身上输出?孩子在输出后做什么?请提供SSCCE:我们需要查看
              fork
              代码的其余部分。为什么
               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