c - C 中的 fork 和 PID

标签 c sockets fork pid child-process

我在这个 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/

相关文章:

c - 在 C 语言中,为什么更多的函数比更复杂的函数更可取?

c - memcpy 使用指针抛出访问冲突

c - PSL1GHT 中的 3d 图形

android - 如何通过Android应用程序进行USB网络共享?

java - Java 中 writeUTF 和 readUTF 的意外值

c - c中fork()&&fork()||fork()是什么意思

c - C中的pthread和子进程数据共享

c - 无效声明 (2)

java - Netty 4 调用被阻止,简单的 Telnet 服务器

子进程不打印任何内容