Sigaction在子进程的声明中返回-1

安徒生

在pong中,代码返回错误打印。 我知道我对信号还不太了解,所以我绝对不知道这里出了什么问题。

据我了解,Sigaction在以下情况下返回-1:

  • 信号无效或无法捕获或忽略
  • SA_SIGINFO位标志设置为不支持实现

由于SIGUSR1是用户定义的信号,因此我看不到为什么无法捕获或忽略它。另外,我还没有接触过SA_SIGINFO,因此除非将其默认设置为无效设置,否则我将不明白为什么会这样。

我的项目大纲指出,我需要在pong()函数(而不是main)中“设置信号处理程序以调用处理程序函数”。但是,Main应该在结束之前发送信号。信号功能应仅打印“ pong结尾”并退出以打破pong内部的无限循环。

编辑3:主要方法是不发送信号到pong()并且代码被挂起。

#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int ping();
int pong();
void handle_SIGUSR1(int signum);

int fdA[2];
int fdB[2];
int ppid;


int ping ()
{
    close(fdA[0]);
    close(fdB[1]);
    int i = 0, check = 0;
    printf("ping - %d\n", i);
    write(fdA[1], &i, sizeof(int));
    while (i < 18)
    {
            read(fdB[0], &i, sizeof(int));
            i++;
            printf("ping - %d\n", i);
            write(fdA[1], &i, sizeof(int));
    }
    close(fdA[1]);
    close(fdB[0]);
    exit(0);
    return 0;

}

int pong()
{
    ppid = getpid();
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = handle_SIGUSR1;
    sa.sa_flags = 0;
    if (sigaction(SIGUSR1, &sa, NULL) == -1)
    {
        printf("error -> sigaction err\n");
    }
    
    int j = 0;
    while (1)
    {
        read(fdA[0], &j, sizeof(int));
        j++;
        printf("pong - %d\n", j);
        write(fdB[1], &j, sizeof(int));
    }
}

void handle_SIGUSR1(int signum)
{
    printf("Pong ending...\n");
    exit(0);
}

int main ()
{
    if (pipe(fdA) == -1 || pipe(fdB) == -1)
        return 1; // pipe initialization error

    int pid = fork();
    if (pid == 0)
    {
        ping();
    }
    else
    {
        ppid = getpid();
        pong();
    }
    kill(ppid, SIGUSR1);
}
乔纳森·莱夫勒

将我的评论的要点转化为答案。

sigaction()仔细研究POSIX规范

问题的一部分可能是您尚未设置信号掩码sa.sa_mask,因此它是随机垃圾,并且推测随机垃圾是不可接受的。sigemptyset(&sa.sa_mask);在致电之前写信可能会解决问题-如果我的分析正确,它将解决问题。基本上,您应该确保已正确/彻底地初始化了结构。即使这不是造成问题的原因,也应始终设置遮罩。阻止一组随机信号不是一个好主意。您应该知道要阻止的内容,因此可以使用sigemptyset()sigfillset()应该使用它来设置掩码-否则可以确保在struct sigaction创建结构时将其清零。

(类似地,您应该确保sa_flags也正确设置成员-有关正确设置结构的先前观点的一部分。NateEldridge在此答案中指出。您应只设置sa_handler和之一sa_sigaction,具体取决于是否设置SA_SIGINFO了的sa_flags。)

但是,您还有另一个更大的问题。好好看一下下面的if语句:

if (sigaction(SIGUSR1, &sa, NULL) == -1);

分号在做什么?不要在这里放分号;这意味着无条件执行之后的代码块。

请注意,应该将错误写入stderr,并且您可以考虑使用perror()或使用errnostrerror()报告错误消息(可能还有错误编号)。但是分号是主要问题。您仍应确保传递给的结构sigaction()已完全初始化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未满足的依赖关系和子进程/ usr / bin / dpkg在DEBIAN中返回了错误代码(1)错误

来自分类Dev

检查终端 1 中的 bash 进程是子进程的父进程,FROM 终端 2?

来自分类Dev

未在子进程中调用sigaction的信号处理程序

来自分类Dev

函数中的 Sigaction 声明

来自分类Dev

为什么子进程“读取”函数不返回(我认为它会返回-1),而子进程“printf”函数不起作用

来自分类Dev

ffmpeg Python子进程错误返回非零退出状态1

来自分类Dev

MongoDB安装错误/ E:子进程/ usr / bin / dpkg返回错误代码(1)

来自分类Dev

“ E:子进程/ usr / bin / dpkg返回错误代码(1)”这是什么意思?

来自分类Dev

E:子进程/ usr / bin / dpkg返回错误代码(1)

来自分类Dev

为什么waitpid()对于所有子进程仅返回1?

来自分类Dev

udev子进程/ usr / bin / dpkg返回了错误代码(1)

来自分类Dev

E:子进程/ usr / bin / dpkg返回错误代码(1)

来自分类Dev

Clonezilla安装-子进程/ usr / bin / dpkg返回了错误代码(1)

来自分类Dev

E:子进程/ usr / bin / dpkg返回错误代码(1)以及其他错误

来自分类Dev

如何修复错误E:子进程/ usr / bin / dpkg返回了错误代码(1)

来自分类Dev

E: 子进程 /usr/bin/dpkg 返回错误码 (1) dpkg error

来自分类Dev

子查询在声明开始日期和结束日期后返回了 1 个以上的值

来自分类Dev

子查询在MySQL过程中返回多于1行

来自分类Dev

子查询在我的代码中返回超过 1 行

来自分类Dev

进程kill()返回意外错误1 Admob

来自分类Dev

仅Python ping 2个IP中的1个(子进程)

来自分类Dev

MongoDB错误:mongodb-10gen E:子进程/ usr / bin / dpkg返回了错误代码(1)

来自分类Dev

E:在sudo apt-get install --fix-missing后,子进程/ usr / bin / dpkg返回错误代码(1)

来自分类Dev

无法安装oracle-java7-installer,显示'E:子进程/ usr / bin / dpkg返回错误代码(1)'

来自分类Dev

如何确保在“安装后脚本:子进程返回错误退出状态 1”后正确安装/更新软件包

来自分类Dev

linux-image-4.15.0-65-generic E: 子进程 /usr/bin/dpkg 返回错误代码 (1)

来自分类Dev

无法安装纸图标主题 [E: 子进程 /usr/bin/dpkg 返回错误代码 (1)] 18.04.3 XFCE

来自分类Dev

E: 子进程/usr/bin/dpkg 从19.10 do-release-upgrade 到20.04 后返回错误码(1)

来自分类Dev

克服子查询返回的值超过1

Related 相关文章

  1. 1

    未满足的依赖关系和子进程/ usr / bin / dpkg在DEBIAN中返回了错误代码(1)错误

  2. 2

    检查终端 1 中的 bash 进程是子进程的父进程,FROM 终端 2?

  3. 3

    未在子进程中调用sigaction的信号处理程序

  4. 4

    函数中的 Sigaction 声明

  5. 5

    为什么子进程“读取”函数不返回(我认为它会返回-1),而子进程“printf”函数不起作用

  6. 6

    ffmpeg Python子进程错误返回非零退出状态1

  7. 7

    MongoDB安装错误/ E:子进程/ usr / bin / dpkg返回错误代码(1)

  8. 8

    “ E:子进程/ usr / bin / dpkg返回错误代码(1)”这是什么意思?

  9. 9

    E:子进程/ usr / bin / dpkg返回错误代码(1)

  10. 10

    为什么waitpid()对于所有子进程仅返回1?

  11. 11

    udev子进程/ usr / bin / dpkg返回了错误代码(1)

  12. 12

    E:子进程/ usr / bin / dpkg返回错误代码(1)

  13. 13

    Clonezilla安装-子进程/ usr / bin / dpkg返回了错误代码(1)

  14. 14

    E:子进程/ usr / bin / dpkg返回错误代码(1)以及其他错误

  15. 15

    如何修复错误E:子进程/ usr / bin / dpkg返回了错误代码(1)

  16. 16

    E: 子进程 /usr/bin/dpkg 返回错误码 (1) dpkg error

  17. 17

    子查询在声明开始日期和结束日期后返回了 1 个以上的值

  18. 18

    子查询在MySQL过程中返回多于1行

  19. 19

    子查询在我的代码中返回超过 1 行

  20. 20

    进程kill()返回意外错误1 Admob

  21. 21

    仅Python ping 2个IP中的1个(子进程)

  22. 22

    MongoDB错误:mongodb-10gen E:子进程/ usr / bin / dpkg返回了错误代码(1)

  23. 23

    E:在sudo apt-get install --fix-missing后,子进程/ usr / bin / dpkg返回错误代码(1)

  24. 24

    无法安装oracle-java7-installer,显示'E:子进程/ usr / bin / dpkg返回错误代码(1)'

  25. 25

    如何确保在“安装后脚本:子进程返回错误退出状态 1”后正确安装/更新软件包

  26. 26

    linux-image-4.15.0-65-generic E: 子进程 /usr/bin/dpkg 返回错误代码 (1)

  27. 27

    无法安装纸图标主题 [E: 子进程 /usr/bin/dpkg 返回错误代码 (1)] 18.04.3 XFCE

  28. 28

    E: 子进程/usr/bin/dpkg 从19.10 do-release-upgrade 到20.04 后返回错误码(1)

  29. 29

    克服子查询返回的值超过1

热门标签

归档