2015-05-24 83 views
-1

爲什麼此代碼不起作用?如果輸入中的數字是偶數,我希望代碼打印figlioA函數的內容,或者如果輸入中的數字是奇數,則代碼將打印另一個代碼內容。哪裏不對?謝謝!C中的信號()不起作用

#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

在哪個操作系統上?看起來像Linux!然後閱讀[signal(7)](http://man7.org/linux/man-pages/man7/signal.7.html),注意你不應該在信號處理程序中調用'printf'。 –

回答

1

這似乎是這裏的錯誤:

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

正確的應該是 「& &」 而不是 「&」:

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

編輯:我得到了它的工作,對於kill函數,正如Chris Dodd所說,你必須傳遞pidA和pidB,而不是在子進程中設置變量的a和b。您還需要將pidA和pidB初始化爲非零值,否則過程圖在接收到信號後可能會進入figlioB部分,您還可以在pause()之後返回子過程。這裏是正確的代碼,我添加了睡眠(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); 
     } 
    } 
} 
+0

謝謝你的回答。我已經修復了代碼。當我插入偶數時,程序會捕獲信號,但信號處理程序中的代碼不起作用。當我插入一個奇數時,信號處理程序不起作用。 –

+0

@AlessandroGuerra:你沒有奇數的信號處理器(SIGUSR2) - 你有兩個信號處理器用於偶數(SIGUSR1),其中第二個將不會做任何事情,因爲它測試SIGUSR2 ... –

+0

@ChrisDodd哦謝謝您!我在測試中改變了代碼,並且寫得不好。我修復了代碼,但仍然存在問題。 –

0

你的代碼有很多問題。除了明顯的拼寫錯誤(&而不是&&,SIGUSR1,你想要SIGUSR2),你有一個問題,你似乎想要在一個孩子中設置一個變量,並使用父值中的值。這是行不通的,因爲孩子和父母都有獨立的記憶,所以他們每個人都有自己的所有變量的私人副本。

因此,當主父(pidA != 0 && pidB != 0)發送信號時,它會將它們發送到ab - 在該過程中從未設置的變量 - 因此它們可能會在任何地方出現。您需要將信號發送到pidApidB(如果那是您希望他們去的地方)。

+0

我已經理解了這個問題。謝謝您的回答。對不起,我是初學者。我試過用kill(pidA,SIGUSR1)發送一個信號,但不起作用。 –