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