2012-10-17 122 views
3

我需要您的幫助來完成一個關於進程間信號處理的練習。我認爲這是一個微不足道的問題,但我無法在任何地方找到答案。我想從父文件打印文件,從父文件發送信號給孩子,孩子必須在文件中打印,然後從孩子向父母發送信號。c中的子進程信號處理

我使用的代碼是這樣的:

#include <stdio.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <unistd.h> 

#define WRITEF 123451 //Random number 

FILE *infile; 

void writef() { 
    fprintf(infile, "Child Starting (%d)\n", getpid()); 
    printf("Child Starting (%d)\n", getpid()); 
} 

int main() { 
    pid_t pid; 

    infile = fopen("pid_log.txt","w"); 
    pid = fork(); 
    signal(WRITEF, writef); 
    if (pid == 0) { 
      pause(); 
      printf("enter child\n"); 
    } 
    else { 
      fprintf(infile, "Parent (%d)\n", getpid()); 
      printf("Parent (%d)\n", getpid()); 
      kill(pid, WRITEF); 
      pause(); 
      wait((int*)1); 
    } 

    fclose(infile); 
    return 1; 
} 
+0

歡迎堆棧溢出。你的代碼是否會產生任何錯誤?哪一個?結果是不正確的?爲什麼? – 2012-10-17 18:51:27

回答

1

問題解決了! 關鍵是您必須在每次暫停()前註冊信號(使用信號功能)。你也不能使用「用戶自制」信號,在我的情況下,我使用了SIGCONT。

這裏是我計劃的最後(幾乎)版本:

#include <stdio.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <signal.h> 
#include <unistd.h> 

FILE *infile; 

void noth() { 

} 

void writec() { 
    infile = fopen("pid_log.txt","a+"); 
    fprintf(infile, "Child (%d)\n", getpid()); 
    printf("Child (%d)\n", getpid()); 
    fclose(infile); 
} 

void writep() { 
    infile = fopen("pid_log.txt","a+"); 
    fprintf(infile, "Parent (%d)\n", getpid()); 
    printf("Parent (%d)\n", getpid()); 
    fclose(infile); 
} 

main() { 
    pid_t pid = fork(); 

    if (pid == 0) {            //child process 
      signal(SIGCONT,noth);       //registering signal before pause() 
      pause(); 
      infile = fopen("pid_log.txt","a+"); 
      printf("Child Starting (%d)\n",getpid()); 
      fprintf(infile,"Child Starting (%d)\n",getpid()); 
      fclose(infile); 
      while (1) { 
        sleep(2); 

        kill(getppid(), SIGCONT);      //sending singal to parent 

        signal(SIGCONT, writec); 

        pause(); 
      } 
    } 
    else {               //parent process 
      infile = fopen("pid_log.txt","a+"); 
      printf("Parent Starting (%d)\n",getpid()); 
      fprintf(infile,"Parent Starting (%d)\n",getpid()); 
      fclose(infile); 
      kill(pid, SIGCONT); 
      signal(SIGCONT, writep); 
      pause(); 
      while (1) { 
        sleep(2); 

        kill(pid, SIGCONT); 

        signal(SIGCONT, writep); 

        pause(); 
      } 
    } 
    return 1; 
}