Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Interprocess Communication with pipe and file

Tags:

linux

fork

pipe

ipc

i'm using linux as operating system and trying to communicate three processes with pipe and file. It should work with any file put on STDIN. And pipe works just fine, but second process is unavailable to write one char into file properly or third to read. Firstly of course i initialize function as semlock and semunlock and opening pipe is also there. I appreciate any help cause i have no clue.

if (!(PID[1] = fork ())) {

    int BUF_SIZE = 4096;
    char d[BUF_SIZE];

    while (fgets (d, BUF_SIZE, stdin) != NULL) {
        write (mypipe[1], &d, BUF_SIZE);
    }
}

if (!(PID[2] = fork ())) {

    int reading_size = 0;
    char r;

    close (mypipe[1]);
    semlock (semid1);
    while (reading_size = read (mypipe[0], &r, 1)) {

        if ((file = fopen ("proces2.txt", "w")) == NULL) {
            warn ("error !!!");
            exit (1);
        }
        fputc (r, file);
        fclose (file);
        semunlock (semid2);
    }
}

if (!(PID[3] = fork ())) {
    char x;

    semlock (semid2);
    do {
        if ((plikProces3 = fopen ("proces2.txt", "r")) == NULL) {
            warn ("Blad przy otwarciu pliku do odczytu !!!");
            exit (1);
        }

        i = getc (plikProces3);
        o = fprintf (stdout, "%c", i);
        fclose (plikProces3);
        semunlock (semid1);
    } while (i != EOF);
}
like image 771
krisskross Avatar asked Jun 26 '26 00:06

krisskross


1 Answers

What makes you think the child runs first? You haven't waited for the child process to finish so can hit EOF reading the file, before the previous child has written. Shouldn't the last fork() call be a wait, so you know the file was written? As it stands you have 4 processes, NOT 3!!

Then you are closing the mypipe[1] in the 2nd child process which as it is a forked copy, does not close the pipe inthe first child. You also are trying to write BUFSIZ characters, so you appear to be trying to write out more characters than were written, try "write (mypipe[1], &d, strlen(d));".

It looks very odd, to have the fopen() & fclose() within the character read/write loop. You really want to re-open & re-write 1 character into the file over and over?

Similarly the process2 file seems to be re-opened so the first character within would be written again and again, if it's non-empty.

There are bound to be other bugs, but that should help you for now.

like image 160
Rob11311 Avatar answered Jun 28 '26 00:06

Rob11311



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!