diff --git a/ostep/hw5/Makefile b/ostep/hw5/Makefile new file mode 100644 index 0000000..15dbb62 --- /dev/null +++ b/ostep/hw5/Makefile @@ -0,0 +1,10 @@ +TARGETS := hw5_1 + +all: $(TARGETS) + +clean: + rm -f $(TARGETS) + +%: %.c + $(CC) -o $@ $< + diff --git a/ostep/hw5/hw5.txt b/ostep/hw5/hw5.txt new file mode 100644 index 0000000..0ca7752 --- /dev/null +++ b/ostep/hw5/hw5.txt @@ -0,0 +1,35 @@ +Homework for chapter 5: Interlude: Process API + +1. Write a program that calls fork(). Before calling fork(), have the main +program access a variable and set its value to something. What value is the +variable in the child process? What happens to the variable when both the child +and the parent change the value of x? + +2. Write a program that opens a new file with open() and then calls fork() to +create a new process. Can both the child and the parent access the file +descriptor returned by open()? What happens when they are writing to the file +concurrently? + +3. Write another program using fork(). The child process should print "hello", +the parent process should print "goodbye". You should try to ensure that the +child process always prints first; can you do this without calling wait() in +the parent? + +4. Write a program that calls fork() and then calls some form of exec() to run +/bin/ls. See if you can try all the variants of exec(), including execl(), +execle(), execlp(), execv(), execvp(), and execevP(). Why do you think there +are so many variants of the same basic call? + +5. Now write a program that uses wait() to wait for the child process to finish +in the parent. What does wait() return? What happens if you use wait() in the +child()? + +6. Write a slight modification of the previous program, this time using +waitpid() instead of wait(). When would waitpid() be useful? + +7. Write a program that creates a child process, and then in the child close +standard output. What happens if the child calls printf() to print some output +after closing the descriptor? + +8. Write a program that creates two children, and connects the standard output +of one to the standard input of the other using the pipe() system call. diff --git a/ostep/hw5/hw5_1.c b/ostep/hw5/hw5_1.c new file mode 100644 index 0000000..97fedfd --- /dev/null +++ b/ostep/hw5/hw5_1.c @@ -0,0 +1,28 @@ +#include +#include + + +int +main(void) +{ + int x = 10; + pid_t pid; + + pid = fork(); + if (pid < 0) { + + } + else if (pid > 0) { + for (int i = 0; i < 5; i++) { + printf("child: x=%d\n", x); + x++; + sleep(1); + } + } else { + for (int i = 0; i < 5; i++) { + printf("parent: x=%d\n", x); + x--; + sleep(1); + } + } +}