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






