标签: waitpid

为什么Linux程序derefrences(char*)0并不总是段错误?

我正在测试用于检测子进程何时进行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)

c linux segmentation-fault waitpid

6
推荐指数
1
解决办法
984
查看次数

为什么Perl是$?为forked进程的退出代码返回错误的值?

考虑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中找到这个文档.这是我的系统上的错误还是我做错了什么?

perl waitpid

6
推荐指数
1
解决办法
5410
查看次数

当OOM杀手杀死一个进程时返回代码

我正在使用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:我发现这篇文章提出了几乎相同的问题.但是,由于这是一个老帖子,答案不尽如人意,我决定发一个新问题.

linux out-of-memory return-code waitpid

6
推荐指数
1
解决办法
9135
查看次数

Linux,waitpid,WNOHANG和僵尸

我需要能够:

  1. fork一个进程并使其成为execvp(我做到了)
  2. 检查子进程execvp是否成功(不知道如何)
  3. 检查子进程是否完成(有问题)

我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用

-1 != waitpid( pid, &status, WNOHANG )
Run Code Online (Sandbox Code Playgroud)

但似乎如果pid进程的execv失败,waitpid不会返回-1.

我该怎么检查?我读了waitpid手册页,但我不清楚; 也许我的英语不够好.

编辑:为了解释更多:
我正在为家庭作业建立自己的终端.我需要输入一个命令字符串,让我们说"ls",然后我必须执行命令.
在子forks之后,子进程调用execvp来执行命令(在我解析字符串之后),并且父进程需要检查命令末尾是否有'&'.
如果命令末尾不存在符号'&',则父进程需要等待子进程执行.

所以我需要知道execvp是否失败了.如果它没有失败,则父使用waitpid等待子进程完成执行.如果失败,那么父母将不会等待孩子.

c c++ fork wait waitpid

6
推荐指数
1
解决办法
9360
查看次数

WIFSIGNALED、WIFSTOPPED、WIFCONTINUED 的 C 语言测试用例

我正在使用 waitpid() 和 signal() 并且我正在寻找可靠的测试用例来返回 WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = true 但找不到任何......

小心告诉我如何确保这些返回 true 以便我可以调试我的代码?

另外,一些关于我应该用 signal() 捕捉什么信号来测试这些宏的提示会很有帮助......

c signals waitpid

5
推荐指数
1
解决办法
2万
查看次数

使用系统调用 fork() execvp() wait() pipeline() 实现多个管道 - 它根本不起作用

我需要实现处理多个管道命令的 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)

这是处理多个管道的函数的源代码。 …

c shell fork pipe waitpid

5
推荐指数
1
解决办法
9719
查看次数

Linux、waitpid、WNOHANG、子进程、僵尸

我作为守护进程运行我的程序。

父进程只等待子进程,当子进程意外死亡时,再次fork并等待。

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)

但是当子进程被-9信号杀死时,子进程就会进入僵尸进程。

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)

这是父亲的踪迹

父亲没有被卡住,wait4 总是被调用。

strace -p 28139
Process 28139 attached …
Run Code Online (Sandbox Code Playgroud)

linux kill process zombie-process waitpid

5
推荐指数
1
解决办法
6619
查看次数

一步杀死并等待

如果我使用组合来批量杀死子进程并等待它终止,我使用

kill $PID
wait $PID
Run Code Online (Sandbox Code Playgroud)

如果该进程立即存在,则该进程wait将失败,因为 pid 不再运行。

有没有办法将两个语句组合成一个语句来避免错误?

编辑:我必须杀死的进程使用临时文件;因此它必须关闭(而不仅仅是发出关闭信号)才能再次启动它。检查 的返回值kill无济于事,因为这表明信号是否已成功传递。

linux bash kill waitpid

5
推荐指数
1
解决办法
4435
查看次数

execv 和 fork:通知父进程子进程执行文件失败

主进程如何知道子进程执行文件失败(例如没有这样的文件或目录)?例如,在下面的代码中,我们怎样才能让 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 fork execv waitpid

5
推荐指数
1
解决办法
3819
查看次数

关于 wait() 和 waitpid()

所以我在 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)

c wait waitpid

5
推荐指数
1
解决办法
1万
查看次数