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