C中的信号()不';行不通

C中的信号()不';行不通,c,signals,fork,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

为什么这个代码不起作用?如果输入中的数字是偶数,我希望代码打印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);
        }
    }
}
#包括
#包括
#包括
int x;
void figlioA(内塞格纳尔){
if(segnale==SIGUSR1)
printf(“x=%d x^3=%d\n”,x,(x*x*x));
}
void figlioB(内部分段){
if(segnale==SIGUSR2)
printf(“x=%d reciproco=1/%d\n”,x,x);
}
int main(int argc,char*argv[]){
int-pidA,pidB;
INTA,b;
x=atoi(argv[1]);
printf(“Processo padre ppid=%d pid=%d\n”,getppid(),getpid());
pidA=fork();
如果(pidA==0){//figlio A
printf(“figlio A ppid=%d pid=%d\n”,getppid(),getpid());
a=getpid();
信号(SIGUSR1,figlioA);
暂停();
}否则
pidB=fork();//crea il figlio B
if(pidB==0)//figlio B
{
printf(“figlio B ppid=%d pid=%d\n”,getppid(),getpid());
b=getpid();
信号(SIGUSR2,figlioB);
暂停();
}
如果(pidA!=0&&pidB!=0){
如果(x%2==0){
kill(a,SIGUSR1);
}
如果(x%2!=0){
杀死(b,SIGUSR2);
}
}
}

这里似乎有个bug:

if (pidA != 0 & pidB != 0) {
正确的数字应该是“&&”而不是“&”:

编辑:我让它工作了,对于kill函数,正如Chris Dodd所说,您必须传递pidA和pidB,而不是子进程中设置的变量a和b。您还需要将pidA和pidB初始化为非零值,否则process figlioA在收到信号后可能会进入figlioB部分,您还可以使子进程在
暂停()后返回。下面是正确的代码,我添加了睡眠(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);
        }
    }
}
#包括
#包括
#包括
#包括
int x;
void figlioA(内塞格纳尔){
if(segnale==SIGUSR1)
printf(“x=%d x^3=%d\n”,x,(x*x*x));
}
void figlioB(内部分段){
if(segnale==SIGUSR2)
printf(“x=%d reciproco=1/%d\n”,x,x);
}
int main(int argc,char*argv[]){
int-pidA=1,pidB=1;
INTA,b;
x=atoi(argv[1]);
printf(“Processo padre ppid=%d pid=%d\n”,getppid(),getpid());
pidA=fork();
如果(pidA==0){//figlio A
printf(“figlio A ppid=%d pid=%d\n”,getppid(),getpid());
a=getpid();
信号(SIGUSR1,figlioA);
暂停();
返回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();
信号(SIGUSR2,figlioB);
暂停();
返回0;
}
睡眠(1);
如果(pidA!=0&&pidB!=0){
如果(x%2==0){
kill(pidA,SIGUSR1);
}
如果(x%2!=0){
杀死(pidB,SIGUSR2);
}
}
}

您的代码有很多问题。除了明显的打字错误(
&
而不是
&
SIGUSR1
您想要
SIGUSR2
)之外,您还有一个问题,您似乎想在子级中设置一个变量,并在父级中使用该值。这是行不通的,因为子(ren)和父(ren)有独立的内存,所以它们都有自己的所有变量的私有副本


因此,当主父级(其中,
pidA!=0&&pidB!=0
)发送信号时,它会将它们发送到
a
b
——在该过程中从未设置过的变量——因此它们可能会移动到任何地方。您需要将信号发送到
pidA
pidB
(如果您想让它们去的地方)。

谢谢您的回答。我已经修正了密码。当我插入偶数时,程序捕获信号,但信号处理程序中的代码不起作用。当我插入奇数时,信号处理程序不起作用。@AlessandroGuerra:您没有奇数信号处理程序(SIGUSR2)--您有两个偶数信号处理程序(SIGUSR1),其中第二个在测试SIGUSR2时永远不会起作用…@chrisdd谢谢!我在测试中修改了代码,结果写得不好。我已经修复了代码,但仍然存在问题。我理解这个问题。谢谢你的回答。对不起,我是初学者。我试图用kill(pidA,SIGUSR1)发送一个信号,但不起作用。在哪个操作系统上?看起来像Linux!然后阅读并注意不要在信号处理程序中调用
printf
#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);
        }
    }
}