CS 350 Operating Systems Spring 2021

CS 350 Operating Systems Spring 2021

CS 350 Operating Systems Spring 2021 Labs for processes 1 Practice 1: fork() • Download the source code – $ wget http://www.cs.binghamton.edu/~huilu/teaching/lecture3/cpu-api.tar.gz – $ tar xvf cpu-api.tar.gz – $ cd cpu-api – $ make • Run the first program p1 – $ ./p1 • Read “p1.c” and make sure you understand what the code does 2 Practice 2: wait() • Run the second program p2 – $ ./p2 • Read “p2.c” and answer the questions: – Why is there a delay for the parent process to print out its message? – What is the return value of the wait()? • Please use “waitpid()” to replace wait()? – Use “man waitpid” command in terminal to check out the usage of waitpid – What is the return value and of waitpid()? – What is the return status of the child process? – Can the parent process wait on other processes (not the child process)? • Try it out and see the result. 3 Practice 3: exec() • Run the third program p3 – $ ./p3 • Read “p3.c” and answer the questions: – Does “execvp()” return? What is the evidence to back your answer? – In which case, “execvp()” returns? Please make a case if possible. 4 Practice 4: Redirection • Run the fourth program p4 – $ ./p4 • Read “p4.c” and answer the questions: – Where is the result stored? – Why does this happen? 5 Practice 5: Orphan process • An orphan process is the one that its parent dies (i.e., finishes its execution) • Please modify “p1” to make such a case – to generate an orphan process – Note you can use the following command to check the parent process id – $ ps -o ppid= -p $pid_of_child_process – Or – $ ps -l – Note that, the orphan process’s parent is systemd with pid of 1 – Make sure you kill the orphan process: – $ killall p1 pid pid of the parent 6 Practice 6: Zombie process • A zombie process is the one that dies (i.e., finishes its execution) but its parent does not check on it via wait() • Please modify “p1” to make such a case – to generate a zombie process – $ ps -l – Make sure you kill the orphan process: You catch – $ killall p1 the zombie 7 Practice 7: Address space • Run the fourth program p5 – $ ./p5 • Read “p5.c” and answer the questions: – Why do the parent and child processes print out the different values for the “same” variables? 8 Practice 8 • Write a program that opens a file (with the open() system call) and then calls fork() to create a new process. • Can both the child and parent access the file descriptor returned by open()? • What happens when they are writing to the file concurrently, i.e., at the same time? 9 Practice 1-8 ● Try your best to finish practice 1-8 from lab slides (download from MyCourses). ● To check the manual of unknown system call functions, please type “man <func name>” in terminal (or google instead). ○ (E.g. “man fork” to see how fork is used, what is the return value of the function and what arguments you can pass to the fork function.) ● We will discuss answers and solutions in the second half of the lab. 10 Practice 1: fork() #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { printf("hello world (pid:%d)\n", (int) getpid()); int rc = fork(); if (rc < 0) { // fork failed; exit fprintf(stderr, "fork failed\n"); exit(1); } else if (rc == 0) { // child (new process) If fork returns 0, then it is in the child process printf("hello, I am child (pid:%d)\n", (int) getpid()); } else { // parent goes down this path (original process) printf("hello, I am parent of %d (pid:%d)\n", If fork returns value greater than 0, then it is in the parent process rc, (int) getpid()); AND the returned value is the child process’s pid. } return 0; } 11 Practice 2: wait() • Run the second program p2 – $ ./p2 • Read “p2.c” and answer the questions: – Why is there a delay for the parent process to print out its message? Wait for the child process and child process sleep for 2 seconds – What is the return value of the wait()? Child process pid • Please use “waitpid()” to replace wait()? – Use “man waitpid” command in terminal to check out the usage of waitpid Child process pid – What is the return value and of waitpid()? – What is the return status of the child process? Stored in wstatus with value 0, means normally terminated – Can the parent process wait on other processes (not the child process)? No, can only wait for its children • Try it out and see the result. 12 Practice 3: exec() • Run the third program p3 – $ ./p3 • Read “p3.c” and answer the questions: – Does “execvp()” return? What is the evidence to back your answer? No, execvp will replace address space to another program, normally it won’t return. – In which case, “execvp()” returns? Please make a case if possible. When execvp runs failed, such as the program does not exist. 13 Practice 4: Redirection • Run the fourth program p4 – $ ./p4 • Read “p4.c” and answer the questions: To the file named “p4.output” – Where is the result stored? – Why does this happen? write-only, offset: 0 This will point to some other files, in our case, p4.output 14 Practice 5: Orphan process • An orphan process is the one that its parent dies (i.e., finishes its execution) • Please modify “p1” to make such a case – to generate an orphan process – Note you can use the following command to check the parent process id – $ ps -o ppid= -p $pid_of_child_process – Or – $ ps -l – Note that, the orphan process’s parent is systemd with pid of 1 – Make sure you kill the orphan process: – $ killall p1 pid pid of the parent 15 Practice 6: Zombie process • A zombie process is the one that dies (i.e., finishes its execution) but its parent does not check on it via wait() • Please modify “p1” to make such a case – to generate a zombie process – $ ps -l – Make sure you kill the orphan process: You catch – $ killall p1 the zombie 16 Practice 7: Address space • Run the fourth program p5 – $ ./p5 • Read “p5.c” and answer the questions: – Why do the parent and child processes print out the different values for the “same” variables? 17 Practice 8 • Write a program that opens a file (with the open() system call) and then calls fork() to create a new process. • Can both the child and parent access the file descriptor returned by open()? • What happens when they are writing to the file concurrently, i.e., at the same time? 18 References • Chapter 4&5 of OSTEP book (please read) – http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-intro.pdf – http://pages.cs.wisc.edu/~remzi/OSTEP/cpu-api.pdf • Man pages for different system calls – Try “man 2 <syscall_name>” • E.g. man 2 exec – Syscalls are normally listed in section 2 of the man page 19.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    19 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us