简体   繁体   中英

how to make a simple synchronization between two processes

hi there i have a work about a programme which is like one child should print a number into a text file and the second child should take that number to print it onto screen simultaneously. but my code is work like first child finishes to printing the numbers 0 through 9 and then second child starts to read them onto screen. so i guess its a synchronization issue. here is my simple code ;

#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");
}*/

by the way, in Ubuntu i used to compile with gcc -o process process.c -lpthread .

I will be appreciated if you can help.

您需要更改为

flush(fptr);  

you might want to consider having the main process create two child threads instead of processes. Child thread A can write to a file, and child thread B would display the number. The main thread can schedule these two child threads when a new number is available.

There doesn't need to be any synchronization performed based on your problem statement, just the outputting of the number at the same time to the screen and file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM