我正在测试用于检测子进程何时进行segfaulted的代码.想象一下,当这段代码并不总是段错误时,我感到很惊讶:
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Debian Linux 2.6.26内核下运行; 我的shell是ksh93来自Debian ksh软件包的AT&T ,版本M 93s + 2008-01-31.有时这个程序会出现段错误,但除此之外它只是以非零退出状态静默终止但没有消息.我的信号检测程序报告如下:
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time …Run Code Online (Sandbox Code Playgroud) 考虑fork()的这个简单示例,然后等待子进程在Perl中死掉:
#!/usr/bin/perl
use strict;
use warnings;
if (fork() == 0) {
exit(1);
}
waitpid(-1,0);
print $?;
Run Code Online (Sandbox Code Playgroud)
在Solaris 10上运行脚本我得到以下结果:
$ perl test.pl
256
Run Code Online (Sandbox Code Playgroud)
我怀疑这些值正在向上移动,因为当我exit(2)在孩子身上时,输出变为512.
我似乎无法在perl的waitpid中找到这个文档.这是我的系统上的错误还是我做错了什么?
我正在使用SUSE SLES 11在POWER7系统上运行多程序工作负载(基于SPEC CPU2006基准测试).
有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量超过系统中安装的可用内存(32 GB).
我禁用了交换,否则测量可能会对使用交换的进程产生严重影响.我知道通过这样做,内核,通过OOM杀手,可能会杀死一些进程.那很好.问题是我希望内核杀死的线程退出时出现错误(例如,进程被信号终止).
我有一个框架,启动所有进程,然后等待使用它们
waitpid(pid, &status, 0);
Run Code Online (Sandbox Code Playgroud)
即使一个线程被OOM杀手杀死(我知道因为我在屏幕上和/ var/log/messages中得到了一条消息),所以
WIFEXITED(status);
Run Code Online (Sandbox Code Playgroud)
返回一个,然后是通话
WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)
返回零.因此,我无法区分进程何时正确完成以及何时被OOM杀手杀死.
我做错了吗?你知道如何检测一个进程被OOM杀手杀死的时间.
非常感谢你,
胜利者
PS:我发现这篇文章提出了几乎相同的问题.但是,由于这是一个老帖子,答案不尽如人意,我决定发一个新问题.
我需要能够:
我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用
-1 != waitpid( pid, &status, WNOHANG )
Run Code Online (Sandbox Code Playgroud)
但似乎如果pid进程的execv失败,waitpid不会返回-1.
我该怎么检查?我读了waitpid手册页,但我不清楚; 也许我的英语不够好.
编辑:为了解释更多:
我正在为家庭作业建立自己的终端.我需要输入一个命令字符串,让我们说"ls",然后我必须执行命令.
在子forks之后,子进程调用execvp来执行命令(在我解析字符串之后),并且父进程需要检查命令末尾是否有'&'.
如果命令末尾不存在符号'&',则父进程需要等待子进程执行.
所以我需要知道execvp是否失败了.如果它没有失败,则父使用waitpid等待子进程完成执行.如果失败,那么父母将不会等待孩子.
我正在使用 waitpid() 和 signal() 并且我正在寻找可靠的测试用例来返回 WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = true 但找不到任何......
小心告诉我如何确保这些返回 true 以便我可以调试我的代码?
另外,一些关于我应该用 signal() 捕捉什么信号来测试这些宏的提示会很有帮助......
我需要实现处理多个管道命令的 shell。例如,我需要能够处理这个:ls | grep -i cs340 | sort | uniq | cut -c 5。我假设问题是我没有将上一个命令的输出传递给下一个命令的输入。当我执行代码时,它没有给我任何输出。我正在使用这个伪代码:
for cmd in cmds
if there is a next cmd
pipe(new_fds)
fork
if child
if there is a previous cmd
dup2(old_fds[0], 0)
close(old_fds[0])
close(old_fds[1])
if there is a next cmd
close(new_fds[0])
dup2(new_fds[1], 1)
close(new_fds[1])
exec cmd || die
else
if there is a previous cmd
close(old_fds[0])
close(old_fds[1])
if there is a next cmd
old_fds = new_fds
if there are multiple cmds
close(old_fds[0])
close(old_fds[1])
Run Code Online (Sandbox Code Playgroud)
这是处理多个管道的函数的源代码。 …
for (; 1;) {
if (fork() == 0) break;
int sig = 0;
for (; 1; usleep(10000)) {
pid_t wpid = waitpid(g->pid[1], &sig, WNOHANG);
if (wpid > 0) break;
if (wpid < 0) print("wait error: %s\n", strerror(errno));
}
}
Run Code Online (Sandbox Code Playgroud)
waitpid应该立即返回子进程的pid!
但waitpid大约90秒后得到了pid号,
cube 28139 0.0 0.0 70576 900 ? Ss 04:24 0:07 ./daemon -d
cube 28140 9.3 0.0 0 0 ? Zl 04:24 106:19 [daemon] <defunct>
Run Code Online (Sandbox Code Playgroud)
strace -p 28139
Process 28139 attached …Run Code Online (Sandbox Code Playgroud) 如果我使用组合来批量杀死子进程并等待它终止,我使用
kill $PID
wait $PID
Run Code Online (Sandbox Code Playgroud)
如果该进程立即存在,则该进程wait将失败,因为 pid 不再运行。
有没有办法将两个语句组合成一个语句来避免错误?
编辑:我必须杀死的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 的返回值kill无济于事,因为这表明信号是否已成功传递。
主进程如何知道子进程执行文件失败(例如没有这样的文件或目录)?例如,在下面的代码中,我们怎样才能让 run() 返回 0 以外的值呢?谢谢!
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
enum ErrorType { noError, immediateFailure, returnFailure, forkFailure };
using namespace std;
int run(void)
{
int error = noError;
//char proc[] = "/bin/uname";
char proc[] = "/usr/bin/Idontexist";
char *const params[] = {proc, NULL};
pid_t pid = fork();
printf("pid = %d\n",pid);
if (pid == 0)
{
if ( execv(proc,params)==-1 )
{
error = immediateFailure;
}
printf("child: error = %d\n",error);
}
else if (pid > 0)
{
/* This is …Run Code Online (Sandbox Code Playgroud) 所以我在 C 上写了这段代码。我创建了一个父亲,它有两个子进程,其中一个变成了僵尸进程。一秒钟后它退出了,正在等他的父亲结束了。另一个子进程保持孤立状态,然后结束。我的问题是,如果我更改waitfor会发生什么waitpid。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status, value;
pid = fork();
if (pid > 0) { // Father
pid = fork();
if (pid > 0) { // Father
wait(&status);
value = WEXITSTATUS(status);
if (value == 2)
printf("Child 2");
else if (value == 3)
printf("Child 1");
} else if (pid == 0) { //Child 2 - Orphan
sleep(4);
exit(2);
} else {
exit(1);
} …Run Code Online (Sandbox Code Playgroud)