User Tools

Site Tools


Sidebar

os_cp:pipes_signals:solutions

Exercise 1

#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
 
int32_t doExpensiveComputation() { return 2 + 2; }
 
int main() {
  int pfds[2];
  pipe(pfds);
  if (!fork()) {
    int32_t result = doExpensiveComputation();
    write(pfds[1], &result, 4);
    return 0;
  }
  int32_t result;
  read(pfds[0], &result, 4);
  printf("The result is: %d\n", result);
  return 0;
}

The following version does a minimum of error checking.

Exercise 2

#include <stdint.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
 
int32_t doExpensiveComputation() {
  sleep(3);
  return 2 + 2;
}
 
int main() {
  int pfds[2];
  pipe(pfds);
  for (int i = 0; i < 3; ++i) {
    if (!fork()) {
      int32_t result = doExpensiveComputation();
      write(pfds[1], &result, 4);
      return 0;
    }
  }
 
  int32_t result[4];
  result[3] = doExpensiveComputation();
 
  for (int i = 0; i < 3; ++i) {
    read(pfds[0], result + i, 4);
    wait(NULL);
  }
 
  printf("The result is: %d\n", result[0] + result[1] + result[2] + result[3]);
  return 0;
}

Exercise 3

#include <ctype.h>
#include <stdio.h>
#include <unistd.h>
 
int main() {
  int pfds[2];
  pipe(pfds);
  if (!fork()) {
    dup2(pfds[1], 1);
    close(pfds[0]);
    close(pfds[1]);
    execlp("ls", "ls", "-l", NULL);
    return 1;
  }
  close(pfds[1]);
  char c;
  while (1 == read(pfds[0], &c, 1)) {
    c = toupper(c);
    write(1, &c, 1);
  }
  return 0;
}

Exercise 4

#include <unistd.h>
 
int main() {
  int pfds[2];
  pipe(pfds);
  if (!fork()) {
    dup2(pfds[1], 1);
    close(pfds[0]);
    close(pfds[1]);
    execlp("ps", "ps", "-eF", NULL);
    return 1;
  }
  dup2(pfds[0], 0);
  close(pfds[0]);
  close(pfds[1]);
  execlp("sort", "sort", "-nk6", NULL);
  return 1;
}

Exercise 5

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
void handleSignal(int num) {
  write(2, "Shutting down...\n", 17);
  exit(1);
}
 
int main() {
  signal(SIGINT, handleSignal);
  while (1)
    getchar();
}

Exercise 6

#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
 
void writeDateTo(int fd) {
  struct timespec now;
  char buf[21];
  clock_gettime(CLOCK_REALTIME, &now);
  buf[20] = '\n';
  for (int i = 0; i < 10; ++i, now.tv_nsec /= 10)
    buf[19 - i] = '0' + now.tv_nsec % 10;
  buf[10] = '.';
  for (int i = 0; i < 10; ++i, now.tv_sec /= 10)
    buf[9 - i] = '0' + now.tv_sec % 10;
  write(fd, buf, 21);
}
 
void handleSignal(int num) {
  int fd = open("signal_log", O_WRONLY | O_APPEND | O_CREAT, 0666);
  writeDateTo(fd);
  close(fd);
}
 
int main() {
  signal(SIGUSR1, handleSignal);
  while (1)
    getchar();
}
os_cp/pipes_signals/solutions.txt · Last modified: 2023/04/18 23:53 by jkonczak