首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的Forks和PID

C语言中的Forks和PID
EN

Stack Overflow用户
提问于 2015-10-31 04:15:42
回答 1查看 70关注 0票数 0

我在这个C语言练习中发现了一些困难:我被要求创建一个服务器套接字,它(通过无限循环)从输入流中读取一个字符串。如果字符串显示为"self",服务器将在输出流上打印服务器自己的pid。如果读取"fork",则调用fork()函数并打印该子进程的pid。我在考虑将这些行包含在while循环中

代码语言:javascript
复制
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来测试服务器):

代码语言:javascript
复制
 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

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-31 04:22:59

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

子目录中的

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

如果您不退出,那么子进程将继续执行与父进程相同的操作。它会踩到父级的脚趾,读取父级的输入,弄乱它的输出,并造成其他形式的小破坏。

建议使用_Exit()而不是exit()来退出子进程。:exit()会运行清理代码,比如刷新你只想让父进程运行的stdio缓冲区。

父级中的

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

孩子应该立即退出,所以等待不会阻塞很长时间。等待子进程可以确保子进程得到清理,而不会变成zombie process.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33444228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档