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
所在的那个)发送信号时,它将它们发送到 a
和 b
-- 从未有过的变量在那个过程中被设置 - 所以他们可能会去任何地方。您需要将信号发送到 pidA
和 pidB
(如果这是您希望它们去的地方)。
为什么这段代码不起作用?如果输入中的数字是偶数,我希望代码打印 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
所在的那个)发送信号时,它将它们发送到 a
和 b
-- 从未有过的变量在那个过程中被设置 - 所以他们可能会去任何地方。您需要将信号发送到 pidA
和 pidB
(如果这是您希望它们去的地方)。