问题标签 [waitpid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - "no child process" error when calling waitpid twice
For some reason, I have to call waitpid
twice on the same child process:
Calling the waitpid
the first time and there are no errors:
The second time:
An error occurred: "No child process". Is there anything wrong with my code?
Update:
If the child process have already exited after or before my first calling of waitpid
, which means the parent process has reaped this child process, the second calling of waitpid
then causes errors. Is this correct?
c - 在 mini-shell 中挂起 2 管道函数时无法将信息存储在全局变量中
我正在编写一个 mini-shell,但在作业控制方面遇到了问题。
我无法检索主函数中的数据,甚至无法在 run_command 的底部检索数据。
我想知道如何在主目录中存储和成功检索信息。
c - fork() 和 waitpid 可能的输出
我的教科书给出了以下主要程序:
它询问可能的输出是什么,我找到了 3 个:
abcc:操作系统选择首先执行的子进程,并打印“a”。然后,操作系统暂停子进程并恢复父进程,打印“b”。然后父母必须等到孩子完成,孩子打印“c”,最后父母打印“c”。
bacc:操作系统选择首先运行的父进程,并打印“b”。然后父母必须等待孩子完成并打印“ac”。然后父母打印“c”。
acbc:操作系统选择子进程先运行直到完成,打印“ac”。然后父进程运行完成,打印“bc”。
但是,教科书中还列出了一个答案,bcac。我不明白这是怎么可能的,因为如果首先打印 b,那么父母必须等待孩子继续,然后打印“ac”,然后父母会打印“c”,给出我已经列出的 bacc . 是否有我遗漏的东西,或者说只有 3 个可能的输出是否正确?
c - Ptrace/等待非孩子
-- 我用 pid 6841 运行了一个守护进程,并试图在 ptrace-attach 之后等待它
简而言之,我希望能够等待非子进程 - 欢迎任何其他程序。
c - waitpid 不工作 - 错误
我正在尝试制作一个在一个文件中运行 exec 然后等待它完成的 fork。如果子进程中的 exec 被信号终止,我想打印信号,如果程序运行时间太长,我想打印超时。
Testreport 是先前声明的 char * 文件名。waitpid 不工作。当我打印 waitpid 的值和产生的 errno 时,我分别得到 -1 和 14。我查了 errno 14,它是一个 EFAULT,这表明 status 的地址是无效的。怎么会这样?
c - 非子节点上的非根 ptrace/waitpid
这是我的 qn 的后续/修改:Ptrace/wait on a non child
如何 ptrace 或等待非子进程且等待的进程不是 root 用户。
我试图在同一个组中,仍然无法工作 [ 不允许操作 - 对非孩子进行 ptrace ]
c - 使用带有 waitpid 的分叉
是否有 3 个子进程和 1 个父进程?这两个不同的waitpid是做什么的,为什么会有两个?
waitpid 之后的第二个 printf 打印 3、5、6、34、52、61(不包括分号)。我不确定如何打印两位数。我知道第二个数字可能来自 while 循环中的 printf。
c - 如何等待线程完成工作,c 中克隆创建的线程在哪里?
我尝试等待 main 函数,直到线程完成它们的工作。但是主函数完成它的工作并退出。我认为因为线程在变量中没有正确的指针/值。(计数和步骤)
有人知道在这种情况下如何正确使用 waitpid/wait 吗?
我的代码:
增量函数:
运行代码后得到的结果:
代码应该用两个线程增加一个变量。为了避免临界区问题,我应该使用信号量。但那是另一个练习。首先练习它使用 clone() 函数创建两个线程。我不明白,如果 clone() 的标志是错误的,或者我的代码是完全错误的。我是编程语言 C 的新手。
我花了过去 12 个小时用谷歌搜索。
我感谢每一个答案:)。
抱歉英语不好。
问候
c - 这个 C 代码可以创建僵尸进程吗?
我想知道以下代码是否可以创建僵尸:
因此,父进程调用子进程的waitpid,如果子进程还没有退出,它会立即返回。所以,到目前为止,还没有僵尸出现。但是,如果孩子之前退出
令这将是一个僵尸呢?我实际上对此感到困惑。waitpid 是否应该是程序终止前的最后一行代码?任何帮助,将不胜感激。谢谢!c - 如何正确计算分叉子进程的实际数量?
前段时间我为自动 S/MIME 处理写了一个简单的 SMTP 门,现在它来测试。与邮件服务器一样,主进程为每个传入连接创建一个子进程。限制创建的子进程的数量是一个很好的做法——所以我做到了。
在重负载期间(同时来自许多客户端的许多连接),似乎没有正确计算子进程- 问题在于当子进程退出时减少计数器。几分钟后重负载计数器大于子进程的实际数量(即 5 分钟后它等于 14,但没有)。
我已经做了一些研究,但没有任何效果。所有僵尸进程都被收割,所以SIGCHLD
处理似乎没问题。我认为这可能是一个同步问题,但是添加一个互斥锁并将变量类型更改为volatile sig_atomic_t
(现在这样)并没有改变。信号屏蔽也不是问题,我尝试使用sigfillset(&act.sa_mask)
.
我注意到waitpid()
有时会返回奇怪的 PID 值(非常大,如 172915914)。
问题和一些代码。
- 是否有可能其他进程(即。
init
)正在收获其中的一些? - 进程退出后不能变成僵尸吗?可以自动收割吗?
- 如何解决?也许有更好的方法来计算它们?
分叉一个孩子main()
:
信号处理:
注意:所有以大写字母开头的函数(如Fork()
,Close()
等Signal()
)与小写朋友 ( fork()
,close()
但signal()
更好的错误处理能力——所以我不必检查它们的返回状态。
注意 2:我在 Debian Testing( kernel v3.10.11
) 下使用gcc 4.8.2
.