C 中的 signal() 不起作用

signal() in C doesn't work

为什么这段代码不起作用?如果输入中的数字是偶数,我希望代码打印 figlioA 函数的内容,或者如果输入中的数字是奇数,则在 figlioB 中打印另一个代码内容。怎么了?谢谢!

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

int x;

void figlioA(int segnale) {
    if (segnale == SIGUSR1)
        printf("x=%d x^3=%d\n", x, (x * x * x));
}

void figlioB(int segnale) {
    if (segnale == SIGUSR2)
        printf("x=%d reciproco=1/%d\n", x, x);
}

int main(int argc, char * argv[]) {
    int pidA, pidB;
    int a, b;
    x = atoi(argv[1]);

    printf("Processo padre ppid=%d pid=%d\n", getppid(), getpid());

    pidA = fork();

    if (pidA == 0) { // figlio A
        printf("figlio A ppid=%d pid=%d\n", getppid(), getpid());
        a = getpid();
        signal(SIGUSR1, figlioA);
        pause();
    } else
        pidB = fork(); // crea il figlio B
    if (pidB == 0) // figlio B
    {
        printf("figlio B ppid=%d pid=%d\n", getppid(), getpid());
        b = getpid();
        signal(SIGUSR2, figlioB);
        pause();
    }
    if (pidA != 0 && pidB != 0) {
        if (x % 2 == 0) {
            kill(a, SIGUSR1);
        }
        if (x % 2 != 0) {
            kill(b, SIGUSR2);
        }
    }
}

这里好像是个bug:

if (pidA != 0 & pidB != 0) {

正确的应该是“&&”而不是“&”:

if (pidA != 0 && pidB != 0) {

编辑:我成功了,对于 kill 函数,正如 Chris Dodd 所说,您必须传递 pidA 和 pidB,而不是 child 进程中设置的变量 a 和 b。您还需要将 pidA 和 pidB 初始化为 non-zero 值,否则进程 figlioA 可能会在收到信号后进入 figlioB 部分,您也可以在 [= 之后使 child 进程 return 13=]。这是正确的代码,我添加了 sleep(1) 让时间到 childs 继续:

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

int x;

void figlioA(int segnale) {
    if (segnale == SIGUSR1)
        printf("x=%d x^3=%d\n", x, (x * x * x));
}

void figlioB(int segnale) {
    if (segnale == SIGUSR2)
        printf("x=%d reciproco=1/%d\n", x, x);
}

int main(int argc, char * argv[]) {
    int pidA=1, pidB=1;
    int a, b;
    x = atoi(argv[1]);

    printf("Processo padre ppid=%d pid=%d\n", getppid(), getpid());

    pidA = fork();

    if (pidA == 0) { // figlio A
        printf("figlio A ppid=%d pid=%d\n", getppid(), getpid());
        a = getpid();

        signal(SIGUSR1, figlioA);
        pause();
        return 0;
    } else pidB = fork(); // crea il figlio B

    if (pidB == 0) // figlio B
    {
        printf("figlio B ppid=%d pid=%d\n", getppid(), getpid());
        b = getpid();
        signal(SIGUSR2, figlioB);
        pause();
        return 0;
    }


    sleep(1);
    if (pidA != 0 && pidB != 0) {
        if (x % 2 == 0) {
            kill(pidA, SIGUSR1);
        }
        if (x % 2 != 0) {
            kill(pidB, SIGUSR2);
        }
    }
}

你的代码有很多问题。除了明显的拼写错误(& 而不是 &&SIGUSR1 你想要 SIGUSR2),你有一个问题,你似乎想在 child 并使用 parent 中的值。这是行不通的,因为 child(ren) 和 parent 有独立的内存,所以它们每个都有自己的所有变量的私有副本。

所以当主 parent(pidA != 0 && pidB != 0 所在的那个)发送信号时,它将它们发送到 ab -- 从未有过的变量在那个过程中被设置 - 所以他们可能会去任何地方。您需要将信号发送到 pidApidB(如果这是您希望它们去的地方)。