$ make gcc -c -o my.o my.c gcc -c -o mylib.o mylib.c gcc -o my my.o mylib.o $ $ ./my Klim is milK milK si Klim $
$ gcc ex2-argv-env.c $ env -i A=99 B=101 ./a.out "Klim is milk" is wrong argc is 4 argv[0]: ./a.out argv[1]: Klim is milk argv[2]: is argv[3]: wrong environ[0]: A=99 environ[1]: B=101 argc is at 0x7fff1c6f8fbc argv is at 0x7fff1c6f8fb0 environ is at 0x600d98 argv[] is at 0x7fff1c6f90b8 environ[] is at 0x7fff1c6f90e0 value of argv[ 0] is 0x7fff1c6fafc7 value of argv[ 1] is 0x7fff1c6fafcf value of argv[ 2] is 0x7fff1c6fafdc value of argv[ 3] is 0x7fff1c6fafdf value of env [ 0] is 0x7fff1c6fafe5 value of env [ 1] is 0x7fff1c6fafea $
$ echo $$ # the pid of the shell 17351 $ ./a.out I'm 17486, my parent is 17351 # just the initial a.out $ ./a.out 1 1 1 I'm 17492, my parent is 17491 # create a chain I'm 17491, my parent is 17490 I'm 17490, my parent is 17489 I'm 17489, my parent is 17351 $ ./a.out 1 1 2 17499 I'm 17502, my parent is 17501 | I'm 17503, my parent is 17501 17500 I'm 17501, my parent is 17500 | I'm 17500, my parent is 17499 17501 I'm 17499, my parent is 17351 / \ $ ./a.out 1 1 2 2 17502 17503 17516 I'm 17519, my parent is 17518 | I'm 17521, my parent is 17520 17517 I'm 17522, my parent is 17520 | I'm 17520, my parent is 17518 17518 I'm 17518, my parent is 17517 / \ I'm 17517, my parent is 17516 17519 17520 I'm 17516, my parent is 17351 / \ $ 17521 17522
for each argument do n = the value of the argument loop n-1 times fork(); if child then goto outer; end loop fork() if parent then break; end for-loop outer: fprintf(stderr, "I'm %d, my parent is %d\n", getpid(), getppid()); if leaf then while (1) pause(); else sum = 0 loop wait for each child n = exit value or signal number sum += n end loop exit(sum) endif
$ gcc ex4-wait.c $ echo $$ 15000 $ ./a.out 2 3 2 15496 I'm 15496, my parent is 15000 / \ I'm 15498, my parent is 15496 15497 15498 I'm 15497, my parent is 15496 / | \ I'm 15501, my parent is 15498 15499 15500 15501 I'm 15500, my parent is 15498 / \ I'm 15499, my parent is 15498 15502 15503 I'm 15503, my parent is 15501 I'm 15502, my parent is 15501 +----- another window ----+ child 15499 signaled with signal 1 | $ kill -1 15499 | child 15500 signaled with signal 9 | $ kill -9 15500 | child 15502 signaled with signal 15 | $ kill -15 15502 | child 15503 signaled with signal 1 | $ kill -1 15503 | child 15501 exited with value 16 | | child 15498 exited with value 26 | | child 15497 signaled with signal 1 | $ kill -1 15497 | $ echo $? +-------------------------+ 27 $
$ ./myrev file1 file2 file3 .. # reading from files, files1.. $ ./myrev # reading from stdin.
loop if root then ch = get a char from stdin else ch = get a char from parent if ch='o' or ch='q' then /* post-order or quit */ for each child do send ch to child get ack from child show this process's info else if ch='p' /* pre-order */ show this process's info for each child do send ch to child get ack from child if not root then send ack to parent if ch='q' then break forever
$ ./a.out ddudduduuu abcde p I'm a, my pid=29845, and my ppid=28861 I'm b, my pid=29846, and my ppid=29845 I'm c, my pid=29847, and my ppid=29845 I'm d, my pid=29848, and my ppid=29847 I'm e, my pid=29849, and my ppid=29847 o I'm b, my pid=29846, and my ppid=29845 I'm d, my pid=29848, and my ppid=29847 I'm e, my pid=29849, and my ppid=29847 I'm c, my pid=29847, and my ppid=29845 I'm a, my pid=29845, and my ppid=28861 q I'm b, my pid=29846, and my ppid=29845 I'm d, my pid=29848, and my ppid=29847 I'm e, my pid=29849, and my ppid=29847 I'm c, my pid=29847, and my ppid=29845 I'm a, my pid=29845, and my ppid=28861 $
loop read from stdin if got 'f' then send 0 1 to the clockwise next process read two numbers from clockwise previous process write the first out (This is the n-th fibonacci number) if got 'p' then write a token to the anti-clockwise next process read a token from anti-clockwise previous process show pid if got 'q' then write a token to the anti-clockwise next process read a token from anti-clockwise previous process exit end loopEach child does
loop monitor two inputs simultaneously (one clockwise and another anti-clockwise) if clockwise input is ready then read two numbers, a and b, from clockwise previous process show them write b (a+b) to clockwise next process if anti-clockwise input is ready then read a token from anti-clockwise previous process if the token is for print then show pid else exit end loop
$ ./a.out 4 p I am 28206 I am 28205 I am 28204 I am 28203, the root f I am 28204, I got 0 1 I am 28205, I got 1 1 I am 28206, I got 1 2 I am root. I got 2 3. Fib(4) = 2 q $
$ ./a.out 4 I am 437 <----- At first, each procoess shows its pid. I am 438 I am 439 I am 440 I am 438, I got 0 1 <----- kill -USR1 437 I am 439, I got 1 1 I am 440, I got 1 2 I am 437. I got 2 3 I am 437, I got 0 1 <----- kill -USR1 440 I am 438, I got 1 1 I am 439, I got 1 2 I am 440. I got 2 3 I am 439 <----- kill -USR2 440 I am 438 I am 437 I am 440. <----- kill -INT 440 $
$ ./a.out 4 I am 437 <----- At first, each process shows its pid. I am 438 I am 439 I am 440 I am 438, I got 0 1 <----- kill -USR1 437 I am 439, I got 1 1 I am 440, I got 1 2 I am 437. I got 2 3 I am 437, I got 0 1 <----- kill -USR1 440 I am 438, I got 1 1 I am 439, I got 1 2 I am 440. I got 2 3 I am 439 <----- kill -USR2 440 I am 438 I am 437 I am 440. <----- kill -INT 440 $
$ gcc ex9-thread-ball.c -lpthread $ ./a.out The balls are 9 6 36 17 40 32 $ ./a.out The balls are 18 6 21 22 25 12 $ ./a.out The balls are 14 11 24 8 38 12 $ ./a.out The balls are 16 35 22 28 30 8 $