vfork
            vforkは、forkでwaitして子プロセスが終了しての運用をカーネルとして実装するものです。実務上では関数コールするのと同じで、あえて新規タスクとして運用する必要はなさそうですが、execで外部コマンド結果の反映では、呼び出し元プロセスと外部コマンドは差し替わるため、新規プロセスを作成した子プロセスでexecとなり、子プロセスが終了するまで親プロセスは待機する必要があり、vforkはそれ故の実装でないかと。
    
  
[root@localhost c]# cat vfork.c
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
void    fork_fun()
{
       int     fd;
       sleep(1);
       fd = open("babakaka.txt", O_RDWR | O_CREAT);
}
void    main(int argc, char *argv[])
{
       int pid, fd, status;
       char    *msg;
       system("rm babakaka.txt");
       fork_fun();
       fd = open("babakaka.txt", O_RDONLY );
       printf("called:%d\n", fd);
       if (fd != -1) {
               close(fd);
       }
       system("rm babakaka.txt");
       if (!strcmp(argv[1], "vfork")) {
               pid = vfork();
               msg = "vforked";
       }
       else {
               pid = fork();
               msg = "forked";
       }
       if (pid == 0) {
               fork_fun();
               exit(0);
       }
       if (!strcmp(argv[1], "wait")) {
               waitpid(pid, &status, 0);
       }
       fd = open("babakaka.txt", O_RDONLY );
       printf("%s:%d\n", msg, fd);
}
[root@localhost c]# ./a.out no_wait called:4 forked:-1 [root@localhost c]# ./a.out wait called:4 forked:4 [root@localhost c]# ./a.out vfork called:4 vforked:4




