無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

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

備考

systemは子プロセスを作成しそれにexecで外部コマンドを実行するもので、外部コマンドが終了するまで復帰されません。vforkでの実装でないかと。

最終更新 2017/01/13 15:18:06 - north
(2012/08/11 16:52:43 作成)