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;
}
4

1 に答える 1

1

問題が解決しました!!!重要なのは、pause() の前にシグナルを登録する (singal 関数を使用する) 必要があることです。また、「ユーザーが作成した」シグナルを使用することはできません。私の場合、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;
}
于 2012-10-18T06:40:30.300 に答える