mirror of https://github.com/t1meshift/os_labs.git
				
				
				
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <string.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <assert.h>
 | 
						|
#include <sys/wait.h>
 | 
						|
 | 
						|
// A macro to simplify my life
 | 
						|
#define FORK_TASK(IN_FORK, IN_THIS) { \
 | 
						|
  int f = fork(); \
 | 
						|
  switch (f) { \
 | 
						|
   case -1: perror("fork() returned an error!"); exit(1); \
 | 
						|
   case  0: IN_FORK; exit(0); \
 | 
						|
   default: IN_THIS; \
 | 
						|
  } \
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
int main() {
 | 
						|
  // Task 8
 | 
						|
  printf("\n\nTask 8\n");
 | 
						|
  int pipefd[2];
 | 
						|
  if (pipe(pipefd) == -1) {
 | 
						|
    perror("Couldn't create pipe!");
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
  char buff[256];
 | 
						|
 | 
						|
  FORK_TASK(
 | 
						|
      {
 | 
						|
        close(pipefd[0]);
 | 
						|
        printf("In fork\n");
 | 
						|
        dup2(pipefd[1], STDOUT_FILENO);
 | 
						|
        snprintf(buff, 256, "Written from fork, pid %d\n", getpid());
 | 
						|
        //printf("FORK: Message = %s, Len = %lu\n", buff, strlen(buff));
 | 
						|
        write(pipefd[1], buff, strlen(buff));
 | 
						|
        close(pipefd[1]);
 | 
						|
      },
 | 
						|
      {
 | 
						|
        wait(NULL);
 | 
						|
        close(pipefd[1]);
 | 
						|
        printf("Fork responded:\n");
 | 
						|
        while (read(pipefd[0], buff, 1) > 0) {
 | 
						|
          printf("%c", buff[0]);
 | 
						|
        }
 | 
						|
        close(pipefd[0]);
 | 
						|
      }
 | 
						|
  )
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 |