pipe.c

DownloadView Raw

/**
 * pipe.c
 *
 * Demonstrates using pipes for IPC.
 *
 * @author mmalensek
 */

#include "kernel/fcntl.h"
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"

int
main(void) {
  // Creates a pipe.
  int fd[2];
  if (pipe(fd) == -1) {
    fprintf(2, "Could not create pipe.\n");
    return 1;
  }

  int pid = fork();
  if (pid == -1) {
    fprintf(2, "Fork failed!\n");
    return 1;
  } else if (pid == 0) {
    // Child
    close(fd[1]); // close write end of pipe
    close(0); // stdin
    dup(fd[0]); // stdin now comes from the pipe

    char buf[100];
    while (true) {
      fgets(0, buf, 100); // Will block here and wait for data from pipe

      // Print out what we've received.
      printf("Receiving <- %s", buf);
    }
  } else {
    // Parent. Will write data to the pipe.
    close(fd[0]); // close the read end of the pipe
    close(1); // stdout
    dup(fd[1]); // stdout now goes to the pipe
    int counter = 0;
    while(true) {
      fprintf(2, "Sending -> %d\n", counter);
      printf("%d\n", counter++);

      // Let's make this slow so we can actually see what's happening
      sleep(10);
    }
  }

  close(fd[0]);
  close(fd[1]);

  return 0;
}