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