1

こんにちは、私は、1 人の子供が数値をテキスト ファイルに出力し、2 番目の子供がその数値を取得して同時に画面に出力するようなプログラムに関する作業を行っています。しかし、私のコードは、最初の子が数字の印刷を終了し、2 番目の子がそれらを画面に読み始めるように機能09ます。同期の問題だと思います。これが私の簡単なコードです。

#include <stdio.h>     /* basic I/O routines.   */
#include <unistd.h>    /* define fork(), etc.   */
#include <sys/types.h> /* define pid_t, etc.    */
#include <sys/wait.h>  /* define wait(), etc.   */
#include <signal.h>    /* define signal(), etc. */
#include <pthread.h>

void write_num(void);
void print_screen(void);
//void catch_child(int);

int main(int argc, char* argv[]) {

        int i, result, pid;

        pid = fork(); /* creates a new process, you only want the parent to spawn children? */

        switch (pid) {

             case -1:
                /* fork error */
                printf("Error occured with fork()\n");
                exit(1);
             case 0:
                /* child process */
                write_num(); 
                exit(0);
             default:
                 /* parent process*/
                {
                //wait(&pid);
                pid = fork(); /* fork new children here */


                switch(pid) {

                    case -1:
                        printf("Error occured with fork()\n");
                        exit(1);

                    case 0: 

                        print_screen();
                        exit(0);

                    default:
                        break;

                         }
                }
     }
    wait(&pid);
    execl("/usr/bin/killall","killall","tail",(char *) 0);
    return 0;
}

void write_num(void){

 FILE* fptr;
 int i;

 fptr=fopen("textfile.txt","w");

    for(i=0; i<10; i++){

        fprintf(fptr,"%d\n",i);
        fflush(stdout);
        sleep(1);

        }
}

void print_screen(void){

        execl("/usr/bin/tail","tail","-f","./textfile.txt",(char *) 0);
        sleep(1);

}

/* first, here is the code for the signal handler
void catch_child(int sig_num)
{
     when we get here, we know there's a zombie child waiting
    int child_status;

    wait(&child_status);
    printf("child exited.\n");
}*/

ちなみに、Ubuntuでは私はgcc -o process process.c -lpthread.

お役に立てれば幸いです。

4

2 に答える 2

1

に変更する必要があります

flush(fptr);  
于 2012-10-03T17:05:49.470 に答える
0

メインプロセスにプロセスの代わりに2つの子スレッドを作成させることを検討することをお勧めします。子スレッドAはファイルに書き込むことができ、子スレッドBは番号を表示します。メインスレッドは、新しい番号が利用可能になったときに、これら2つの子スレッドをスケジュールできます。

問題の説明に基づいて同期を実行する必要はありません。画面とファイルに同時に数値を出力するだけです。

于 2012-10-03T17:02:27.687 に答える