2012-10-17 121 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; 
}