Start homework 5.
This commit is contained in:
		
							parent
							
								
									04b031c6f2
								
							
						
					
					
						commit
						1f90323879
					
				| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					TARGETS :=	hw5_1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all: $(TARGETS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -f $(TARGETS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%: %.c
 | 
				
			||||||
 | 
						$(CC) -o $@ $<
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue