Process API Programming
āļāļąāļāļāđāļāļąāļ Getpid()
, getppid()
Getpid()
, getppid()
āđāļāđāļāļīāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļāļāļĩāđāļāļ°āđāļĢāļĩāļĒāļāļāļđāļŦāļĄāļēāļĒāđāļĨāļāļāļāļāđāļāļĢāđāļāļŠāđāļāđāđāļāļĒāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļāļāļāļāļ āļēāļĐāļēāļāļĩ/āļāļĩāļāļĨāļąāļŠāļāļĨāļąāļŠ āđāļāđāđāļāđāļāļąāļāļāđāļāļąāļ getpid()
āļŠāļģāļŦāļĢāļąāļāļŦāļĄāļēāļĒāđāļĨāļāļāļąāļ§āļāļĩāđāļāļđāļāļŠāļĢāđāļēāļāđāļĨāļ°āļāļąāļāļāđāļāļąāļ getppid()
āļŠāļģāļŦāļĢāļąāļāļŦāļĄāļēāļĒāđāļĨāļāļāļąāļ§āļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("My pid = %d. My parent's pid = %d\n", getpid(), getppid());
return 0;
}
āđāļāđāļĨāļ°āļāļĢāļąāđāļāļāļĩāđāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ showid āļāđāļāļ°āđāļŠāļāļ pid āļāļĩāđāđāļāļāļāđāļēāļāļāļąāļāđāļ (āđāļāļīāđāļĄāļāļķāđāļ) āđāļāđāļĒāļąāļāļāļāđāļāđāļ parent pid āļŦāļĄāļēāļĒāđāļĨāļāđāļāļīāļĄ
$ gcc -o showpid showpid.c -Wall
$ ./showpid
My pid = 854. My parent's pid = 381
$ ./showpid
My pid = 855. My parent's pid = 381
$ ./showpid
My pid = 856. My parent's pid = 381
$ ./showpid
My pid = 857. My parent's pid = 381
$ ps x
...
381 p2 S 0:01 -sh (csh)
...
$
āļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļļāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļĢāđāļāļŠāļāļąāļāđāļŠāļāļāđāļāđāļāļāļāļąāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđāđāļāļĒāļāļ°āđāļĢāļĩāļĒāļāđāļāđ System Call āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļāļ°āđāļĢāļĩāļĒāļāđāļāđ fork()
āđāļāđāļāļāđāļ

āđāļāļĒāļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļāļ·āļāđāļĄāļ·āđāļāđāļāļĢāđāļāļŠāđāļŦāļĄāđāđāļāļīāļāļāļķāđāļ āļāļķāđāļāđāļĢāļĩāļĒāļāļ§āđāļēāđāļāļĢāđāļāļŠāļĨāļđāļ (child process) āļāļ°āļĄāļĩāļŦāļĨāļēāļĒāđāļĨāļāļāļĢāļ°āļāļģāđāļāļĢāđāļāļŠāđāļāļīāđāļĄāļāđāļāļĄāļēāļāļēāļāļŦāļĄāļēāļĒāđāļĨāļāļāļāļāđāļāļĢāđāļāļŠāļāļĩāđāļŠāļĢāđāļēāļāļŦāļĢāļ·āļāđāļĢāļĩāļĒāļāļ§āđāļēāđāļāļĢāđāļāļŠāđāļĄāđ (parent process) āļāļąāļ§āđāļāļĢāđāļāļŠāđāļŦāļĄāđāļāļ°āļāļģāļāļēāļĢāļāļąāļāļĨāļāļāļāđāļēāļāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ (code, globals, heap āđāļĨāļ° stack) āļāļāļāđāļāļĢāđāļāļŠāđāļĄāđ āļāļāļāļāļēāļāļāļąāđāļāļāļąāđāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļĨāļ°āđāļāļĢāđāļāļŠāļĨāļđāļāļāļ°āđāļāđāļāļĢāļąāļāļĒāļēāļāļĢāļĢāđāļ§āļĄāļāļąāļ

āļāļēāļĢāļāļģāļāļēāļāļāļāļāļāļąāđāļāļŠāļāļāđāļāļĢāđāļāļŠāļāļ°āļāļģāļāļēāļāđāļāļāļĢāđāļāļĄāđāļāļąāļ (concurrency) āđāļāļĒāđāļāļĢāđāļāļŠāđāļĄāđāļāļ°āļĢāļāđāļŦāđāđāļāļĢāđāļāļŠāļĨāļđāļāļāļģāļāļēāļāđāļŠāļĢāđāļāļŠāļīāđāļ āļāļēāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāđāļŠāļāļāļāļēāļĢāļāļąāļāļĨāļāļāļāļ·āđāļāļāļĩāđāļāļāļāļāļģāđāļŦāļāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļŠāļĄāļ·āļāļ (virutal address space)

āļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļēāļ fork()
āđāļāļ·āđāļāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļ
// simpfork.c
#include <stdio.h>
#include <unistd.h>
main()
{
int i;
printf("simpfork: pid = %d\n", getpid());
i = fork();
printf("Did a fork. It returned %d. getpid = %d. getppid = %d\n",
i, getpid(), getppid());
}
$ gcc -o simpfork simpfork.c -Wall
$ ./simpfork
simpfork: pid = 914
Did a fork. It returned 915. getpid = 914. getppid = 381
Did a fork. It returned 0. getpid = 915. getppid = 914
āļāļĨāļāļēāļĢāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāđāļĄāļ·āđāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļāđāđāļāđāļēāļāļĢāļāļāļāļĢāļāļ CPU āļāļĨāļāļĩāđāļāļāļāļĄāļēāļāļ°āđāļŠāļāļāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļŠāļāļĩāđāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļ āļāļķāđāļāđāļāļāļĢāļāļĩāļāļĩāđāļāļ·āļāļŦāļĄāļēāļĒāđāļĨāļ 915 āđāļāļĒāļāļĩāđāđāļāļĢāđāļāļŠāđāļĄāđ (simpfork) āļāļ°āļĄāļĩāļŦāļĄāļēāļĒāđāļĨāļ 914 āđāļĨāļ° bash shell āļāļ°āļĄāļĩāļŦāļĄāļēāļĒāđāļĨāļ 381 āļāļķāđāļāđāļĄāļ·āđāļāđāļāļĢāđāļāļŠāđāļĄāđāļāļāļāļāļēāļāļāļēāļĢāļāļĢāļāļāļāļĢāļāļ CPU āđāļĨāđāļ§ āļāļąāļ§āđāļāļĢāđāļāļŠāļĨāļđāļāļāļĩāđāđāļāļīāļāđāļŦāļĄāđ (āļŦāļĄāļēāļĒāđāļĨāļ 915) āļāđāļāļ°āđāļāđāļēāđāļāļāļĢāļāļāļāļĢāļāļ CPU āļāđāļ āļāļķāļāļāļģāđāļŦāđāļĄāļĩāļāļēāļĢāļŠāđāļāļāđāļēāļāļĨāļąāļāļĄāļēāļāļēāļ fork() āđāļāđāļēāļāļąāļāļĻāļđāļāļĒāđ (0) āđāļāļĒāļāļĩāđāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļŠāļŦāļĨāļąāļāļāđāļāļ°āđāļāđāļāđāļĨāļāļāļāļāļĄāļąāļāđāļāļ (915) āđāļĨāđāļ§āļāļēāļĄāļāđāļ§āļĒāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļŠāđāļĄāđ āļāļķāđāļāđāļāļāļĩāđāļāļĩāđāļāđāļāļ·āļ āđāļāļĢāđāļāļĢāļĄ simpfork
āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāđāļāļāļēāļāļāļĢāļąāđāļāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ simpfork āđāļāđāļĨāļ°āļāļĢāļąāđāļāļāļēāļĢāđāļŠāļāļāļāļĨāļāļēāļāļāļ°āđāļĄāđāđāļāđāļāļāļēāļĄāļĨāļģāļāļąāļāļāļ°āļāļĩāđāļāļĩāļĒāļ§ āļāļĨāđāļēāļ§āļāļ·āļ āđāļāļĢāđāļāļŠāļĨāļđāļāļāļēāļāļāļ°āđāļāđāđāļāđāļēāļāļĢāļāļāļāļĢāļāļ CPU āļāđāļāļāđāļāļĢāđāļāļŠāđāļĄāđ āļāđāđāļāđāļāđāļāđāļāđ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ ./simpfork
simpfork: pid = 928
Did a fork. It returned 0. getpid = 929. getppid = 928
Did a fork. It returned 929. getpid = 928. getppid = 381
āđāļāļ·āđāļāļāļģāļŠāļąāđāļāļŦāļāđāļ§āļāđāļ§āļĨāļēāļāļĢāļ°āļĄāļēāļ 5 āļ§āļīāļāļēāļāļĩ (sleep(5);
) āđāļ§āđāđāļāļāļąāļ§āđāļāļĢāđāļāļŠāļĨāļđāļ āļāļķāđāļāļāļ°āļāļģāđāļŦāđāđāļāļĢāđāļāļŠāđāļĄāđāļāļģāļāļēāļāļŠāļīāđāļāļŠāļļāļāđāļāļāđāļāļ āđāļāļĒāđāļĄāđāđāļāđāļĢāļāđāļŦāđāđāļāļĢāđāļāļŠāļĨāļđāļāđāļŠāļĢāđāļāļāđāļāļ
// simpfork2.c
#include <stdio.h>
#include <unistd.h>
main()
{
int i;
i = fork();
if (i == 0) {
printf("Child. getpid() = %d, getppid() = %d\n", getpid(), getppid());
sleep(5);
printf("After sleeping. getpid() = %d, getppid() = %d\n",
getpid(), getppid());
} else {
printf("Parent exiting early...\n");
}
}
$ gcc -o simpfork2 simpfork2.c -Wall
$ ./simpfork2
Child. getpid() = 1301, getppid() = 1300
Parent exiting now
After sleeping. getpid() = 1301, getppid() = 1
āđāļĄāļ·āđāļāļāļģāļāļēāļĢāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļķāđāļāļĄāļē āđāļāļĢāđāļāļŠāļĨāļđāļāļāđāļāļ°āļŦāļĨāļąāļāđāļāļāļąāđāļ§āļāļāļ°āļāļĢāļ°āļĄāļēāļ 5 āļ§āļīāļāļēāļāļĩ āđāļāđāđāļĄāļ·āđāļāļāļ·āļāļāļķāđāļāļĄāļēāļāļĢāļēāļāļāļ§āđāļēāļāļąāļ§āđāļāļĢāđāļāļŠāđāļĄāđāđāļāđāļāļģāļāļēāļāđāļŠāļĢāđāļāļŠāļīāđāļāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ āļāļķāļāļāļģāđāļŦāđāļāđāļēāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļĢāļĄāđāļĄāļ·āđāļāđāļāđāļāļģāļŠāļąāđāļ getppid()
āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļŠāđāļāļāđāļēāļāļĨāļąāļāļāļāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļāļīāļĄ (simpfork2) āđāļāđ āļāļąāļāļāļąāđāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļķāļāļāļģāļāļĢāđāļēāđāļĄāđāļāļąāļāļāļĩ āđāļĨāļ°āļāļđāļāļāļķāđāļāđāļāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāļēāļĢāļāļđāđāļĨāđāļāļāļāđāļ§āļĒāđāļāļĢāđāļāļŠāļāļąāļ§āđāļĢāļāļāļāļāļĢāļ°āļāļāļāļĩāđāļĄāļĩāļŦāļĄāļēāļĒāđāļĨāļāđāļāļĢāđāļāļŠ 1 āļāļķāđāļāļĢāļđāđāļāļąāļāļāļąāļāđāļāļāļēāļĄ init
āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļķāđāļāļĄāļē āļāļ·āđāļāļāļĩāđāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļ°āļāļđāļāļāļąāļāļĨāļāļāļĄāļēāļāļēāļāđāļāļĢāđāļāļŠāđāļĄāđ āļŦāļĨāļąāļāļāļēāļāļāļĩāđāļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļ fork()
āđāļĨāđāļ§āļāļąāđāļāļŠāļāļāđāļāļĢāđāļāļŠāļāđāļāļ°āļĄāļĩāļāļ·āđāļāļāļĩāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļŠāļģāļŦāļĢāļąāļāđāļāđāļāļāļąāļ§āđāļāļĢ j
āđāļĨāļ° K
āđāļĒāļāļāļąāļāđāļ āđāļāļĒāđāļĄāđāļāļĢāļ°āļāļāļāļąāļ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
// simpfork3.c
#include <stdio.h>
#include <unistd.h>
int K;
main()
{
int i;
int j;
j = 200;
K = 300;
printf("Before forking: j = %d, K = %d ", j, K);
i = fork();
if (i > 0) { /* Delay the parent */
sleep(1);
printf("After forking, parent: j = %d, K = %d\n", j, K);
} else {
j++;
K++;
printf("After forking, child: j = %d, K = %d\n", j, K);
}
}
$ gcc -o simpfork3 simpfork3.c -Wall
$ ./simpfork3
Before forking: j = 200, K = 300
After forking, child: j = 201, K = 301
After forking, parent: j = 200, K = 300
āđāļĄāļ·āđāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ simpfork3 āļāļąāļāļāđāļēāļāļāļ āļāļ°āļŠāļąāļāđāļāļāļ§āđāļēāļāļĨāļĨāļąāļāļāđāļāļĩāđāđāļāļīāļāļāļķāđāļāļāļ·āļ āļāđāļēāđāļāļāļąāļ§āđāļāļĢ j
āđāļĨāļ° K
āļāļāļāđāļāđāļĨāļ°āđāļāļĢāđāļāļŠāļāļ°āđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļĒāļāļāļāļāļāļēāļāļāļąāļ
āđāļāļ·āđāļāđāļŦāđāđāļŦāđāļāļāļĪāļāļīāļāļĢāļĢāļĄāđāļāļāļēāļĢāļāļąāļāļĨāļāļāļāļ·āđāļāļāļĩāđāđāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļēāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļāđāļāļąāļāđāļāļāļāļķāđāļ āļŠāļēāļĄāļēāļĢāļāļāļāļŠāļāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāđāļŦāļĄāđāļāļĩāļāļāļĢāļąāđāļāđāļāļĒāđāļŦāđāđāļŠāļāļāļāļĨāļĨāļąāļāļāđāđāļāđāļāđāļāļĨāļāđāļāđāļāļĨāđāđāļāļ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ simpfork3 > output
$ cat output
Before forking: j = 200, K = 300
After forking, child: j = 201, K = 301
Before forking: j = 200, K = 300
After forking, parent: j = 200, K = 300
āļāļēāļāļāļĨāļĨāļąāļāļāđāļāļ°āļŠāļąāļāđāļāļāđāļŦāđāļāđāļāđāļ§āđāļē āļ āļēāļĒāđāļāđāļāļĨāđ output āļāļ°āđāļāđāļāļāđāļāļāļ§āļēāļĄāļāđāļģāļāļąāļāđāļāļīāļāļāļķāđāļ āđāļāļ·āđāļāļāļāļēāļāļ§āđāļēāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļĩāđāļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāļāļģāļŠāļąāđāļ fork()
āļāļąāđāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļ°āļāļđāļāļāļīāļĄāļāđāļāļāļāđāļāļĒāļąāļāđāļāļĨāđ (standard output) āļāđāļ§āļĒāļāļģāļŠāļąāđāļ printf("Before forking: j = %d, K = %d ", j, K);
āļāļąāđāļāļāļ°āļāļđāļāļāļąāļāđāļāđāļāđāļ§āđāļāļąāđāļ§āļāļĢāļēāļ§ (buffer) āđāļāļēāđāļ§āđāļāđāļāļ āļāļķāđāļāļāđāļēāļĒāļąāļāđāļĄāđāđāļāđāļĄ buffer (āļāļĩāđāļĄāļĩāļāļāļēāļāļāļĢāļ°āļĄāļēāļ 4KB āļāļķāļ 8KB) āļāđāļĒāļąāļāđāļĄāđāļŠāđāļāļāļāļāđāļāļĒāļąāļāđāļāļĨāđāļāđāļāļ āđāļāđāđāļāļāļāļ°āļāļąāđāļāđāļāļāļāļąāļ§āđāļāļĢāđāļāļŠāļĨāļđāļāļāđāđāļāđāļāļģāļāļēāļĢāļāļąāļāļĨāļāļāļāđāļēāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļąāđāļāļŦāļĄāļāļāļāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļ§āđāđāļĨāđāļ§ āļāļķāđāļāļāđāļāļīāļāļāđāļēāļāļĩāđāļāļąāļāđāļāđāļāđāļ§āđāđāļ buffer āļāļąāđāļāļāđāļ§āļĒāđāļāđāļāļāļąāļ āļāļąāļāļāļąāđāļāđāļĄāļ·āđāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļģāļāļēāļāđāļĨāļ°āđāļāđāļāļģāļŠāļąāđāļ printf("After forking, child: j = %d, K = %d\n", j, K);
āļāđāļāļĄāļđāļĨāđāļāļīāļĄāļāļĩāđāļāđāļēāļāļāļĒāļđāđāđāļ buffer āļāļĩāđāļāļđāļāļāļąāļāļĨāļāļāļĄāļēāļāļķāļāļāļđāļāđāļāļĩāļĒāļāļĨāļāđāļāļĨāđāļāđāļģāļāļĩāļāļāļĢāļąāđāļāļāļąāđāļāđāļāļ
āđāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāđāļĄāļ·āđāļāļāļąāđāļāđāļāļĢāđāļāļŠāđāļĄāđāđāļĨāļ°āđāļāļĢāđāļāļŠāļĨāļđāļ āļāđāļāļāđāļāđāļēāđāļāđāļāļĢāļąāļāļĒāļēāļāļĢāļĢāđāļ§āļĄāļāļąāļ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļĨāđ āđāļāđāļāļāđāļ
// simpfork4.c
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
main() {
int i;
int seekp;
int fd;
char *s1;
char s2[1000];
fd = open("tmpfile", O_WRONLY | O_TRUNC | O_CREAT, 0666);
s1 = "Before forking\n";
write(fd, s1, strlen(s1));
i = fork();
if (i > 0) {
sleep(1); /* Delay the parent by one second */
s1 = "Parent";
} else {
s1 = "Child";
}
seekp = lseek(fd, 0, SEEK_CUR);
sprintf(s2, "%s: After forking: Seek pointer = %d\n", s1, seekp);
write(fd, s2, strlen(s2));
}
$ gcc -o simpfork4 simpfork4.c -Wall
$ ./simpfork4
$ cat tmpfile
Before forking
Child: After forking: Seek pointer = 15
Parent: After forking: Seek pointer = 55
āļāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļāđāļ āđāļĄāļ·āđāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ simpfork4 āđāļĨāđāļ§ āđāļāļĢāđāļāļŠāđāļĄāđāļāļ°āđāļĢāļīāđāļĄāļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāđāļŦāļĄāđāļāļ·āđāļāļ§āđāļē tmpfile
āļŦāļĨāļąāļāļāļēāļāļāļąāđāļāļāđāļāļ°āđāļĢāļīāđāļĄāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāđāļŦāļĄāđ (āđāļāļĢāđāļāļŠāļĨāļđāļ) āļāđāļ§āļĒāļāļģāļŠāļąāđāļ fork()
āđāļāļĒāļāļąāđāļāļŠāļāļāđāļāļĢāđāļāļŠāļāđāļēāļāļāđāđāļāđāļēāđāļāđāđāļāļĨāđāļāļĩāđāđāļāļāļēāļĢāđāļāļĩāļĒāļāļĢāđāļ§āļĄāļāļąāļ
āļāļēāļĢāļŠāļīāđāļāļŠāļļāļāļāļāļāđāļāļĢāđāļāļŠāđāļāļīāļāļāļķāđāļāđāļāđāļŦāļĨāļēāļĒāļāļĢāļāļĩ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ
āđāļāļĢāđāļāļŠāļāļģāđāļāļīāļāļāļēāļĢāļāļļāļāļāļģāļŠāļąāđāļāļāļāļāļķāļāļāļĢāļĢāļāļąāļāļŠāļļāļāļāđāļēāļĒ (last statement) āļāļāļāļāļąāļāļāđāļāļąāļ
main()
āđāļāļĒāļāļąāđāļ§āđāļāļāļ°āđāļāđāļāļŠāđāļāļāđāļēāļāļĨāļąāļāđāļāđāļāļĻāļđāļāļĒāđ (exit (0);
)āļĄāļĩāļāļēāļĢāļŠāļīāđāļāļŠāļļāļāđāļāļĢāđāļāļŠāļāļĩāđāļāļīāļāļāļĨāļēāļ (error exit) āđāļāļĒāļāļąāđāļāđāļ āļāļķāđāļāļāļ°āđāļāđāļāļāļēāļĢāļŠāđāļāļāđāļēāļāļĨāļąāļāļāļĩāđāđāļĄāđāđāļāđāđāļĨāļāļĻāļđāļāļĒāđ āđāļāđāļāđāļāđāļāļģāļŠāļąāđāļ
exit (2);
āļŦāļĢāļ·āļexit (-1);
āđāļāđāļāļāđāļāļĄāļĩāļāļēāļĢāļŠāļīāđāļāļŠāļļāļāļāļāļāđāļāļĢāđāļāļŠāļāļĩāđāļĨāđāļĄāđāļŦāļĨāļ§ (fatal exit) āđāļāļĒāđāļĄāđāļāļąāđāļāđāļ āđāļāđāļāđāļāļāļĢāļāļĩāļāļēāļĢāļāļģāļāļāļĢāļāļēāļāļāļāļīāļāļĻāļēāļŠāļāļĢāđ āđāļāđāļāļāļĢāļāļĩāļāļēāļĢāļŦāļēāļĢāļāđāļ§āļĒāļĻāļđāļāļĒāđ (divided by zero) āļŦāļĢāļ·āļāļāļĢāļāļĩāđāļāļīāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāđāļāļŦāļāđāļ§āļĒāđāļāđāļāļēāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļāđāļāļāđāļ
āļĄāļĩāļāļēāļĢāļŠāļīāđāļāļŠāļļāļāļāļāļāđāļāļĢāđāļāļŠāđāļāļāļĢāļāļĩāļāļĩāđāļĄāļĩāđāļāļĢāđāļāļŠāļāļ·āđāļāļāļģāļāļēāļĢāļāđāļē (kill) āļŦāļĢāļ·āļāļŠāļąāđāļāđāļŦāđāļŦāļĒāļļāļāđāļĨāļ°āļŠāļīāđāļāļŠāļļāļāļāļēāļĢāļāļģāļāļēāļāđāļāļĢāđāļāļŠ
āđāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļēāļĄāļĨāļģāļāļąāļāļāļĩāđāļāļģāļŦāļāļāļāļąāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ āđāļāļĒāđāļāđāļāļąāļāļāđāļāļąāļ wait()
āđāļāļāļēāļĢāļāļ§āļāļāļļāļĄāļāļēāļĢāđāļāļīāļāđāļāļĢāđāļāļŠāļāļēāļĄāļĨāļģāļāļąāļāļāļĩāđāļāļģāļŦāļāļ

// simpfork5.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
int main() {
pid_t pid1, pid2, pid3, pid4;
printf("Parent[A] of all: %d\n", getpid());
pid1 = fork();
if (pid1 == 0) { // Child Process, lets say B.
printf("Child[B] with id: %d and its Parent id: %d \n", getpid(),
getppid());
pid2 = fork();
if (pid2 == 0) { // Child process, lets say D.
printf("Child[D] with id: %d and its Parent id: %d \n", getpid(),
getppid());
}
}
if (pid1 > 0) {
pid3 = fork();
if (pid3 == 0) { // Child process, lets say C.
printf("Child[C] with id: %d and its Parent id: %d \n", getpid(),
getppid());
pid4 = fork();
if (pid4 == 0) { // Child process, lets say E.
printf("Child[E] with id: %d and its Parent id: %d \n",
getpid(), getppid());
}
}
}
for (int i = 0; i < 3; i++)
wait(NULL);
}
āđāļĄāļ·āđāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļąāļ§āđāļāļĢāđāļāļŠāđāļĄāđ (A) āļāļ°āļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāļāļēāļĄāļĨāļģāļāļąāļ B-->D
āđāļĨāļ° C-->E
$ gcc -o simpfork5 simpfork5.c -Wall
$ ./simpfork5
Parent[A] of all: 27385
Child[B] with id: 27386 and its Parent id: 27385
Child[C] with id: 27387 and its Parent id: 27385
Child[D] with id: 27388 and its Parent id: 27386
Child[E] with id: 27389 and its Parent id: 27387
āđāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļąāļāļāđāļāļąāļ exec()
, wait()
āđāļĨāļ° exit()
// simpfork6.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
int pid;
/* fork another process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
exit(-1);
} else if (pid == 0) { /* child process */
execlp("/bin/ls", "ls", NULL);
} else { /* parent process */
/* parent will wait for the child to complete */
wait(NULL);
printf("Child Complete -- parent now exiting.\n");
exit(0);
}
return 0;
}
āđāļĄāļ·āđāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļąāļ§āđāļāļĢāđāļāļŠāđāļĄāđāļāļ°āļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāđāļāļ·āđāļāđāļŦāđāļāļģāļāļēāļĢāļĢāļąāļāļāļģāļŠāļąāđāļ ls
āļāļāļāļ§āđāļēāļāļ°āļāļģāļāļēāļāđāļŠāļĢāđāļāļŠāļīāđāļ āđāļāļĒāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļ wait(NULL);
āđāļāļ·āđāļāļĢāļāđāļāļĢāđāļāļŠāļĨāļđāļ
$ gcc -o simpfork6 simpfork6.c -Wall
$ ./simpfork6
simpfork6 simpfork6.c
Child Complete -- parent now exiting.
āđāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļģāļŠāļąāđāļāļāļĩāđāđāļĄāđāļĄāļĩāļāļĒāļđāđāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ
// simpfork7.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
void main() {
int n, m, status;
n = fork();
if (n == -1)
exit(1);
else {
if (n != 0) /* Parent Process */
{
printf("-p-- value of fork %d PID = %d \n", n, getpid());
printf("-p-- Parent PID = %d \n", getppid());
m = wait(&status);
printf("-p-- first exit status = %d \n", status);
status = status >> 8;
printf("-p-- exit status of child process = %d\n", status);
printf("-p-- child PID that just stop = %d\n", m);
fflush(stdout);
m = execl("com", "com", NULL);
printf(" Return to parent process ** ,m=%d \n", m);
exit(0);
} else {
printf("\n");
printf("\n");
printf("-c-- value of fork = %d \n", n);
printf("-c-- this PID = %d and Parent PID = %d\n "\
, getpid(),
getppid());
sleep(4);
fflush(stdout);
m = execl("com", "com", NULL);
exit(2);
}
}
}
$ gcc -o simpfork7 simpfork7.c -Wall
$ ./simpfork7
-p-- value of fork 4463 PID = 4462
-p-- Parent PID = 2646
.
.
.
-c-- value of fork = 0
-c-- this PID = 4463 and Parent PID = 4462
-p-- first exit status = 512
-p-- exit status of child process = 2
-p-- child PID that just stop = 4463
Return to parent process ** ,m=-1
āđāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļĨāļąāļāļĐāļāļ° shell āļāļĒāđāļēāļāļāđāļēāļĒāđāļāļ·āđāļāļĢāļąāļāļāļģāļŠāļąāđāļāļāļĩāđāļāđāļāļāđāļāđāļēāļĄāļē (command line) āđāļĨāđāļ§āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļŠāļĨāļđāļāđāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļģāļŠāļąāđāļāļāļąāđāļ āđāļāļĒāļāļąāđāļāļŠāļāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļāļāļ°āļāļĩāļĒāļāđāļāļĢāļđāļāđāļāļāļ āļēāļĐāļē C āđāļĨāļ°āļ āļēāļĐāļē C++
// simpshell.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
/* a simple define for convenience */
#define TRUE 1
int main() {
/* C declaration before any function call */
int pid, i = 0;
char tab[256], *s;
/* the main loop of our shell */
while (TRUE) {
/* the printf to print strings and numbers */
printf("prompt %d> ", i);
/* "flush" the standard output */
fflush(stdout);
/* read the command line */
s = gets(tab);
if (s == NULL) { /* <Control+D> pressed */
fprintf(stderr, "Bye bye\n");
exit(0);
}
/* one process running */
pid = fork();
/* 2 processes running */
printf("I'm running\n");
switch (pid) /* where are we ? */
{
case 0: /* in the child! */
printf("In the child\n");
/* exec command */
execlp(tab, tab, NULL);
/* executed only if the exec command fails */
perror("exec");
exit(0);
break;
case -1: /* in... the parent: fork has failed no wait!*/
perror("fork");
break;
default: /* in the parent, the fork worked! */
printf("In the parent.. wait\n");
wait(0);
i++; /* for the next command */
}
}
/* end of the loop */
return 0;
}
$ gcc -o simpshell simpshell.c -Wall
$ ./simpshell
prompt 0> ls
I'm running
In the parent.. wait
I'm running
In the child
pipe1.c pipe3.c programA signal simpfork7 simpshell Other_Multi-Socket.zip chat_socket simpshell.c simpshell.cc
5287 done
prompt 1> date
I'm running
In the parent.. wait
I'm running
In the child
Fri Sep 12 07:42:28 ICT 2014
5288 done
prompt 2> pwd
I'm running
In the parent.. wait
I'm running
In the child
/home/wiroon/os
5289 done
// simpshell.cc
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>
using namespace std;
/* a simple define for convenience */
#define TRUE 1
int main() {
int pid, i = 0;
char tab[1024];
/* the main loop of our shell */
while (TRUE) {
/* print strings and numbers */
cout << "prompt " << i << "> ";
/* read the command line */
cin >> tab;
if (tab[0] == 0) { /* <Control+D> pressed */
cerr << "Bye bye\n";
exit(0);
}
/* one process running */
pid = fork();
/* 2 processes running */
cout << "I'm running\n";
switch (pid) /* where are we ? */
{
case 0: /* in the child! */
cout << "In the child\n";
/* exec command */
execlp(tab, tab, NULL);
/* executed only if the exec command fails */
perror("exec");
exit(0);
break;
case -1: /* in... the parent: fork has failed no wait!*/
perror("fork");
break;
default: /* in the parent, the fork worked! */
cout << "In the parent.. wait\n";
cout << wait(0) << " done\n";
i++; /* for the next command */
}
}
/* end of the loop */
return 0;
}
$ g++ -o simpshell simpshell.cc -Wall
$ ./simpshell
prompt 0> ls
I'm running
In the parent.. wait
I'm running
In the child
pipe1.c pipe3.c programA signal simpfork7 simpshell Other_Multi-Socket.zip chat_socket simpshell.c simpshell.cc
5287 done
prompt 1> date
I'm running
In the parent.. wait
I'm running
In the child
Fri Sep 12 07:42:28 ICT 2014
5288 done
prompt 2> pwd
I'm running
In the parent.. wait
I'm running
In the child
/home/wiroon/os
5289 done
Last updated
Was this helpful?