Warning: include(remarks.php): failed to open stream: No such file or directory in /mnt/tanenbaum/sd3/thesards/masson/W3/v2/Teachings/PR-IT-4205/tp1/content.php on line 3
Warning: include(): Failed opening 'remarks.php' for inclusion (include_path='.:/usr/share/php5:/usr/share/php') in /mnt/tanenbaum/sd3/thesards/masson/W3/v2/Teachings/PR-IT-4205/tp1/content.php on line 3
Exercise 1 - Anne, sister Anne, do you see anything coming?Write a program doing the following, in order:
- show "MY PID IS <pid>" with printf (no newline) to get the PID: getpid ()
- show "my PID is <pid>" with write (again without newline)
- fork ()
- display "I AM THE <PARENT|CHILD> AND MY PID IS <pid>" with printf (still no new line)
- display "I am the <parent|child> and my PID is" using write (still no new line)
- force the display of all these messages, for example with puts("").
Exercise 2 - Hit the road, Jack
- Set environment variables RUN_0, RUN_1, RUN_2 ..., then write a program displaying them one after the other. You must use the getenv() function to retrieve the value of a variable. The program will display all the variables, until there is one that does not exist, for example if only RUN_0, RUN_1 and RUN_3 are defined only 0 and 1 have to be printed (as RUN_2 does not exist, the program must stop).
- Using fork() and execvp(), write a program, we will call mrun, which runs programs present in RUN_0, RUN_1, etc.. with the arguments of the command line. For example, if RUN_0=ls and RUN_1=cat, then the command "mrun titi.c foo.c" will be the same as "ls foo.c titi.c ; cat foo.c titi.c". To wait for the termination of a command before starting the next one, use wait().
Exercise 3 - Fork Accident
- Tricky question: Write a process which, through the system call fork (), launches 20 processes, each one posting "I'm number <1-20>, my PID is <pid> and my father is <pid>" (use write() on that shot). Think carefully before you start your program (if you're not careful, you will crash your PC - you have been warned).
- Once the above program works fine, change it so that the parent process, after launching the 20 sons, infinitely loops (while(1) pause();). With the ps command, list your processes: why the 20 sons are still there, although their execution is complete?
- Use the system call waitpid() to correct the problem in the previous question. For each child process which terminates its execution, display "the process No. <x> with PID <y> just finished."