Process API Programming

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 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)

āļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

  • āđ„āļĨāļšāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ unistd.h

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pid_t getpid(void);

    • āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pid_t getppid(void);

    • āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int fork(void);

    • āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļˆāļ°āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰ (āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ) āđ‚āļ”āļĒāļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āđāļ•āđˆāļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļĻāļđāļ™āļĒāđŒāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļ­āļ‡

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 1

āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ 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 

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 2

āđ€āļžāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡āļŦāļ™āđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ›āļĢāļ°āļĄāļēāļ“ 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

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 3

āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ‚āļķāđ‰āļ™āļĄāļē āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļˆāļ°āļ–āļđāļāļ„āļąāļ”āļĨāļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļ 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 āļ—āļĩāđˆāļ–āļđāļāļ„āļąāļ”āļĨāļ­āļāļĄāļēāļˆāļķāļ‡āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļŸāļĨāđŒāļ‹āđ‰āļģāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļ™āļąāđˆāļ™āđ€āļ­āļ‡

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 4

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļĄāļ·āđˆāļ­āļ—āļąāđ‰āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāđˆāļ§āļĄāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

// 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() āđ‚āļ”āļĒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđˆāļēāļ‡āļāđ‡āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāđˆāļ§āļĄāļāļąāļ™

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int execv(char *programName, char *argv[]);

    • āļˆāļ°āļĢāļ°āļšāļļāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ (programName) āļ—āļĩāđˆāļˆāļ°āļ™āļģāđ€āļ‚āđ‰āļēāļĄāļēāļšāļĢāļĢāļˆāļļāđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ”āļīāļĄāļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđ€āļāđˆāļēāļ­āļĒāļđāđˆ āļāđ‡āļˆāļ°āļ–āļđāļāđāļ—āļĒāļ—āļĩāđˆāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ (programName) āļ—āļąāļ™āļ—āļĩ āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āļąāļ§āļ–āļąāļ”āļĄāļēāļ„āļ·āļ­ argv āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļ°āđ€āļĢāļĒāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ”āļąāļŠāļ™āļĩāļŠāļĩāđ‰āļŠāļļāļ”āļ­āļ°āđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āđ‚āļ”āļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ exec āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļ–āļķāļ‡ 6 āđāļšāļš

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ void exit(int returnCode);

    • āđ€āļ›āđ‡āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ system call āļ—āļĩāđˆāļˆāļ°āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ‚āļ”āļĒāļ„āđˆāļē returnCode āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļāļģāļĨāļąāļ‡āļ„āļ­āļĒāđƒāļŦāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int wait(int *returnCode);

    • āđ€āļ›āđ‡āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ system call āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ system call āļ•āļąāļ§āļ™āļĩāđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĢāļ­āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļąāļ§āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™ āđ‚āļ”āļĒāļ„āđˆāļēāļ—āļĩāđˆ system call āļ•āļąāļ§āļ™āļĩāđ‰āļˆāļ°āļŠāđˆāļ‡āļāļĨāļąāļšāļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āļĢāļŦāļąāļŠāļ—āļĩāđˆāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļžāļ­āļĒāļ—āđŒāđ€āļ•āļ­āļĢāđŒ returnCode

    • āđ„āļĨāļšāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ sys/wait.h

āļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļāļĢāļ“āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™

  • āđ‚āļ›āļĢāđ€āļ‹āļŠāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļˆāļ™āļ–āļķāļ‡āļšāļĢāļĢāļ—āļąāļ”āļŠāļļāļ”āļ—āđ‰āļēāļĒ (last statement) āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ main() āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāđ€āļ›āđ‡āļ™āļĻāļđāļ™āļĒāđŒ (exit (0);)

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļœāļīāļ”āļžāļĨāļēāļ” (error exit) āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āđƒāļˆ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāđ€āļĨāļ‚āļĻāļđāļ™āļĒāđŒ āđ€āļŠāđˆāļ™āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ exit (2); āļŦāļĢāļ·āļ­ exit (-1); āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļĨāđ‰āļĄāđ€āļŦāļĨāļ§ (fatal exit) āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āļąāđ‰āļ‡āđƒāļˆ āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢāļ„āļģāļ™āļ‹āļĢāļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ āđ€āļŠāđˆāļ™āļāļĢāļ“āļĩāļāļēāļĢāļŦāļēāļĢāļ”āđ‰āļ§āļĒāļĻāļđāļ™āļĒāđŒ (divided by zero) āļŦāļĢāļ·āļ­āļāļĢāļ“āļĩāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļŦāļ™āđˆāļ§āļĒāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ·āđˆāļ™āļ—āļģāļāļēāļĢāļ†āđˆāļē (kill) āļŦāļĢāļ·āļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļŦāļĒāļļāļ”āđāļĨāļ°āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 5

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 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

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 6

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ 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.

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 7

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ

// 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 

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 8

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ° 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

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ āļēāļĐāļē C++

// 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?