Hello all,

Thanking in advance for the answers again!

I have a program reads from a file then pipes it to a Unix filter program, this last program adds lines to the original file, then prints it on the screen.

I tested my program with a 116K file, it worked, but then I tried a larger file (400+ Kb) and it halted. The program froze, didn't do anything, as if it's blocking.I found out that a 127-128 KB file will still work, but a larger file will not.

What is causing this?? Is it because I somehow have to manage the reads and writes?

My program so far:

Code:

/*      Chihwah Li
 *      elke textregel in een bestand voorzien van regelnummer.
 */

#include <stdio.h>
#include <sys/types.h> //
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/time.h>

struct timeval start, finish ;
int msec;


int main(int argc, char** argv) {
    int X[2], Y[2];

    void Parent(int *X, int *Y, int fp);
    void Child(int *X, int *Y, int noLines);

    pipe(X);
    pipe(Y); /* Create Communication Channels */

    char *inFile;       //
    int fp, noLines;    //

    if (argc != 2 && argc != 3) {
        fprintf(stderr, "usage: %s [-n] <filename>\n", argv[0]);
        return (EXIT_FAILURE);
    }

    // dubbele check of de argumenten goed staan
    inFile = (argc == 2) ? argv[1] : argv[2]; 
    noLines = (argc == 3) ? 1 : 0; 
    if ((noLines == 1) && (strcmp(argv[1],"-n") < 0)) {
        fprintf(stderr,"usage: %s [-n] <filename>\n",argv[0]);
        return (EXIT_FAILURE);
    }
    if ((fp = open( inFile, O_RDONLY)) == -1) {
        perror("");
        return (EXIT_FAILURE);
    }
    
    gettimeofday (&start, NULL); // Tijdmeting starten

    switch (fork()) {
        case 0: Child(X, Y, noLines);
            break;
        case -1: perror("Can\'t create child");
            exit(1);
        default: Parent(X, Y, fp);
    }

    if (close(fp) == -1) {
        perror("close filename: ");
        return (EXIT_FAILURE);
    }

    exit(0);
}

void Parent(int *X, int *Y, int fp) {
    char c;
    close(X[0]);
    close(Y[1]); 

    while (read(fp, &c, 1) > 0){
        write(X[1], &c, 1); /* read data from stdin */
    }

    close(X[1]);

    while (read(Y[0], &c, 1) > 0){
        write(1, &c, 1); /* write data to stdout */
    }
    
    
    // checken y en x of dat juist is
    gettimeofday (&finish, NULL);
    msec = finish.tv_sec * 1000 + finish.tv_usec / 1000;
    msec -= start.tv_sec * 1000 + start.tv_usec / 1000;

    fprintf(stderr, "Time: %d milliseconds\nPress [Enter] to see the uniq, sorted list: ", msec);

    
    
    close(Y[0]);

    wait(0);
}

void Child(int *X, int *Y, int noLines) {
    close(X[1]);
    close(Y[0]);
    close(0);
    dup(X[0]);
    close(X[0]); 
    close(1);
    dup(Y[1]);
    close(Y[1]); 
    if (noLines == 0){
        execlp("nl", "nl", NULL);                       // add line numbers
    } else {
        execlp("sed", "sed","'N;s/\n/\t/'", NULL);    // remove line numbers
    }

    perror("fault by exec: ");
    exit(1);
}