在C语言中处理子进程信号

3
我需要你在进程间信号处理方面提供帮助。我认为这是一个琐碎的问题,但我无法在任何地方找到答案。我想要在父进程中将内容打印到文件中,然后从父进程向子进程发送一个信号,子进程必须将内容打印到文件中并向父进程发送一个信号。
我使用的代码如下:
#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;
}

欢迎来到Stack Overflow。你的代码有没有产生错误?是哪一个?你得到的结果不正确吗?为什么? - user647772
1个回答

1
问题解决了!!! 关键是在每个pause()之前注册信号(使用signal函数)。此外,您不能使用“用户制作”的信号,在我的情况下我使用了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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接