Exercise 1
#include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]){ char buffer[256]; while(1){ int length = read(STDIN_FILENO, buffer, 256); if(length == -1){ perror(NULL); return 1; } if(length == 0) break; write(STDOUT_FILENO, buffer, length); } return 0; }
Exercise 2
#include <unistd.h> #include <stdio.h> int readFile(){ char buffer[256]; while(1){ int length = read(STDIN_FILENO, buffer, 256); if(length == -1){ perror(NULL); return 1; } if(length == 0) return 0; write(STDOUT_FILENO, buffer, length); } } int main(int argc, char *argv[]){ if(readFile()) return -1; lseek(STDIN_FILENO, 0, SEEK_SET); if(readFile()) return -1; return 0; }
Exercise 3
#include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]){ char buffer[256]; while(1){ int length = read(4, buffer, 256); if(length == -1){ perror(NULL); return 1; } if(length == 0) break; write(STDOUT_FILENO, buffer, length); } return 0; }
Exercise 4
#include <unistd.h> #include <fcntl.h> #include <stdio.h> int main(int argc, char *argv[]){ int fd = open("/tmp/z", O_RDONLY); if(fd == -1){ perror(NULL); return 1; } char buffer[256]; while(1){ int length = read(fd, buffer, 256); if(length == -1){ perror(NULL); return 1; } if(length == 0) break; write(STDOUT_FILENO, buffer, length); } close(fd); return 0; }
Exercise 5
#include <unistd.h> #include <fcntl.h> #include <stdio.h> int main(int argc, char *argv[]){ int fd = open(argv[1], O_RDONLY); if(fd == -1){ perror(NULL); return 1; } char buffer[256]; while(1){ int length = read(fd, buffer, 256); if(length == -1){ perror(NULL); return 1; } if(length == 0) break; write(STDOUT_FILENO, buffer, length); } close(fd); return 0; }
Exercise 6
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]){ int fd = open(argv[1], O_RDONLY); if(fd == -1){ perror(NULL); return 1; } int num = 1; int printNumber = 1; while(1){ char c; int count = read(fd, &c, 1); if(count == -1){ perror(NULL); return 1; } if(count == 0) break; if(printNumber){ char numBuf[16]; sprintf(numBuf, "%5d ", num++); write(STDOUT_FILENO, numBuf, strlen(numBuf)); printNumber=0; } write(STDOUT_FILENO, &c, 1); if(c == '\n') printNumber=1; } close(fd); return 0; }
Exercise 7
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #define CHECK(result, textOnFail) \ if(result == -1){ \ perror(textOnFail); \ return 1; \ } int main(int argc, char *argv[]){ if(argc < 3){ write(STDERR_FILENO, "Not enough arguments\n", 21); return 1; } int file1 = open(argv[1], O_RDONLY); CHECK(file1, argv[1]); int file2 = open(argv[2], O_RDONLY); CHECK(file2, argv[2]); while(1){ char buf1[256], buf2[256]; int len1 = read(file1, buf1, 256); CHECK(len1, argv[1]); int len2 = read(file2, buf2, 256); CHECK(len2, argv[2]); if(len1 != len2) break; if(len1 == 0){ write(STDOUT_FILENO, "Files have the same contents\n", 29); return 0; } if(memcmp(buf1, buf2, len1)) break; } write(STDOUT_FILENO, "Files differ\n", 13); return 0; }
Exercise 8
#include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]){ ++argv; --argc; // get rid of program name; simplifies array indexes int *file = malloc(sizeof(int) * argc); int running = 0; for(int i = 0; i < argc; ++i){ file[i] = open(argv[i], O_RDONLY); if(file[i] == -1) perror(argv[i]); else running = 1; } while(running){ running = 0; for(int i = 0; i < argc; ++i){ while(file[i] != -1){ char c; int l = read(file[i], &c, 1); if(l <= 0){ if(l == -1) perror(argv[i]); close(file[i]); file[i] = -1; break; } if(c == '\n'){ running = 1; break; } write(STDOUT_FILENO, &c, 1); } write(STDOUT_FILENO, (i == argc-1) ? "\n" : "\t", 1); } } free(file); return 0; }
Exercise 9
#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 10
#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(); }