如何在两个进程之间进行简单的同步

时间:2012-10-03 16:19:40

标签: c process synchronization multiprocessing parent-child

在那里,我有一个关于程序的工作,就像一个孩子应该将数字打印到文本文件中,第二个孩子应该使用该数字将其同时打印到屏幕上。但我的代码就像第一个孩子完成打印数字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进行编译。

如果你能提供帮助我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您需要更改为

flush(fptr);  

答案 1 :(得分:0)

您可能需要考虑让主进程创建两个子线程而不是进程。子线程A可以写入文件,子线程B可以显示该数字。当新数字可用时,主线程可以安排这两个子线程。

不需要根据您的问题陈述执行任何同步,只需同时输出数字到屏幕和文件。