vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,
vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间
完全复制到子进程中,因为子进程会立即调用exec,于是也就不会存放该地址空间。
。不过在子进程中调用exec或exit之前,他在父进程的空间中运行。
vfork和fork之间的另一个区别是: vfork保证子进程先运行,在她调用exec或exit之后
父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作
,则会导致死锁。
用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,
当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数
开始执行,因为调用exec并不创建新进程,所以前后的进程id 并未改变,exec只是用
另一个新程序替换了当前进程的正文,数据,堆和栈段。
Listing 3.4 (fork-exec.c) Using fork and exec Together
- #include
-
- #include
-
- #include
-
- #include
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int spawn (char* program, char** arg_list)
-
- {
-
- pid_t child_pid;
-
-
-
-
-
- child_pid = fork ();
-
- if (child_pid != 0)
-
-
-
- return child_pid;
-
- else {
-
-
-
- execvp (program, arg_list);
-
-
-
- fprintf (stderr, "an error occurred in execvp\n");
-
- abort ();
-
- }
-
- }
-
-
-
- int main ()
-
- {
-
-
-
- char* arg_list[] = {
-
- "ls",
-
- "-l",
-
- "/",
-
- NULL
-
- };
-
-
-
-
-
-
-
- spawn ("ls", arg_list);
-
-
-
- printf ("done with main program\n");
-
-
-
- return 0;
-
- }
阅读(2338) | 评论(0) | 转发(0) |