C中的signal()不起作用

时间:2015-05-24 19:25:31

标签: c signals fork

为什么这段代码不起作用?如果输入中的数字是偶数,我希望代码打印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);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

这似乎是一个错误:

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

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

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

编辑:我得到了它的工作,对于kill函数,正如Chris Dodd所说,你必须传递pidA和pidB,而不是a和b,它们是子进程中设置的变量。您还需要将pidA和pidB初始化为非零值,否则进程figlioA可能在收到信号后进入figlioB部分,您也可以使子进程在pause()之后返回。这是正确的代码,我添加了sleep(1)让孩子们继续学习的时间:

#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);
        }
    }
}

答案 1 :(得分:0)

您的代码存在很多问题。除了明显的拼写错误(&而不是&&SIGUSR1,你想要SIGUSR2),你有一个问题,你似乎想要在一个孩子和使用父级中的值。这不起作用,因为子(ren)和父亲有独立的记忆,所以他们每个人都有自己的所有变量的私人副本。

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