get-id.c main( ) { printf( "My PID is %d\n", getpid( ) ); printf( "My parent's PID is %d\n", getppid( ) ); printf( "My User ID (UID) is %d\n", getuid( ) ); printf( "My Group ID (GID) is %d\n", getgid( ) ); }
Test: get-id.c $ id uid=500(f) gid=500(f) groups=500(f) $ gcc -o get-id get-id.c $./get-id My PID id 653 My parent's PID is 636 My User ID (UID) is 500 My Group ID (GID) is 500 $
Före fork zfork() klonar en process zPå bilden är processen mitt i systemanropet program PC Anrop till fork() fork() Här kommer den nya processen att skapas
Efter fork program PC Anrop till fork() fork() program PC Anrop till fork() fork() Parent processChild process (ny!) Returnerar barnets PID Returnerar noll Här skapades nya processen
Test: fork main( ) { int kidpid; printf( "Single process with pid %d\n", getpid( ) ); kidpid = fork( ); if( kidpid < 0 ) { printf( "Fail: cannot fork\n" ); exit( 1 ); } if( kidpid > 0 ) /* parent */ { printf( "P: This is the parent with pid: %d\n", getpid( ) ); printf( "P: My child process has pid: %d\n", kidpid ); } else /* kidpid == 0, child */ { printf( "C: This is the child with pid: %d\n", getpid( ) ); printf( "C: My parent has pid: %d\n", getppid( ) ); }
Test: fork $ gcc -o forktest forktest.c $./forktest Single process with pid 800 P: This is the parent with pid: 800 C: This is the child with pid: 801 C: My parent has pid: 800 P: My child process has pid: 801 $
Före och efter exec Prog- ram 1 PC Anrop till exec exec Prog- ram 2 PC processprocess (samma gamla!) Returnerar inte! Här utförs exec
Signaler zEn signal bryter det program processen kör och startar processens signal-handler zDet finns en standard-handler som används om man inte skrivit någon egen zDet går att returnera från signal-handler och fortsätta där programmet var zAlla signaler har någon egenhet - se upp!
wait tid process fork() child process exit() wait() sleeping SIGCHLD
zombie tid process fork() child process exit() wait() zombie SIGCHLD
Bad parent (never waits) tid process fork() child process exit() init blir styvförälder zombie SIGCHLD exit()