想找一家公司设计网站,免费下载的网页模板,关键词wordpress,网站代建设费用吗转载#xff1a;http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本#xff0c;它将获得父进程数据空间、堆、栈等资源的副本。注意#xff0c;子进程持有的是上述…转载http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本它将获得父进程数据空间、堆、栈等资源的副本。注意子进程持有的是上述存储空间的“副本”这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程因此子进程有了独立的地址空间。)也就是这两个进程做完全相同的事。 在fork后的子进程中使用exec函数族可以装入和运行其它程序(子进程替换原有进程和父进程做不同的事)。 fork创建一个新的进程就产生了一个新的PIDexec启动一个新程序替换原有的进程因此这个新的被 exec 执行的进程的PID不会改变(和调用exec的进程的PID一样)。 exec函数族 1 #include unistd.h2 extern char **environ;3 int execl(const char *path,4           const char *arg, ...);5 int execlp(const char *file, 6            const char *arg, ...);7 int execle(const char *path,8            const char *arg,9            ..., 
10            char * const envp[]);
11 int execv(const char *path,
12           char *const argv[]);
13 int execvp(const char *file, 
14            char *const argv[]);
15 int execve(const char *file,
16             char *const argv[],
17             char *const envp[]);  exec函数族装入并运行程序path/file并将参数arg0(arg1, arg2, argv[], envp[])传递给子程序出错返回-1. 在exec函数族中后缀l、v、p、e指定函数将具有某种操作能力 后缀 操作能力 l 希望接收以逗号分隔的参数列表列表以NULL指针作为结束标志 v 希望接收到一个以NULL结尾的字符串数组的指针 p 是一个以NULL结尾的字符串数组指针函数可以DOS的PATH变量查找子程序文件 e 函数传递指定参数envp允许改变子进程的环境无后缀e时子进程使用当前程序的环境 具体例子 1 #ifdef HAVE_CONFIG_H2 #include config.h3 #endif4 5 #include stdio.h6 #include stdlib.h7 #include unistd.h8 #include string.h9 #include errno.h10 11 int main(int argc, char *argv[])12 {13   //以NULL结尾的字符串数组的指针适合包含v的exec函数参数14   char *arg[]  {ls, -a, NULL};15   16   /**17    * 创建子进程并调用函数execl18    * execl 中希望接收以逗号分隔的参数列表并以NULL指针为结束标志19    */20   if( fork()  0 )21   {22     // in clild 23     printf( 1------------execl------------\n );24     if( execl( /bin/ls, ls,-a, NULL )  -1 )25     {26       perror( execl error  );27       exit(1);28     }29   }30   31   /**32    *创建子进程并调用函数execv33    *execv中希望接收一个以NULL结尾的字符串数组的指针34    */35   if( fork()  0 )36   {37     // in child 38     printf(2------------execv------------\n);39     if( execv( /bin/ls,arg)  0)40     {41       perror(execv error );42       exit(1);43     }44   }45   46   /**47    *创建子进程并调用 execlp48    *execlp中49    *l希望接收以逗号分隔的参数列表列表以NULL指针作为结束标志50    *p是一个以NULL结尾的字符串数组指针函数可以DOS的PATH变量查找子程序文件51    */52   if( fork()  0 )53   {54     // in clhild 55     printf(3------------execlp------------\n);56     if( execlp( ls, ls, -a, NULL )  0 )57     {58       perror( execlp error  );59       exit(1);60     }61   }62   63   /**64    *创建子里程并调用execvp65    *v 望接收到一个以NULL结尾的字符串数组的指针66    *p 是一个以NULL结尾的字符串数组指针函数可以DOS的PATH变量查找子程序文件67    */68   if( fork()  0 )69   {70     printf(4------------execvp------------\n);71     if( execvp( ls, arg )  0 )72     {73       perror( execvp error  );74       exit( 1 );75     }76   }77   78   /**79    *创建子进程并调用execle80    *l 希望接收以逗号分隔的参数列表列表以NULL指针作为结束标志81    *e 函数传递指定参数envp允许改变子进程的环境无后缀e时子进程使用当前程序的环境82    */83   if( fork()  0 )84   {85     printf(5------------execle------------\n);86     if( execle(/bin/ls, ls, -a, NULL, NULL)  -1 )87     {88       perror(execle error );89       exit(1);90     }91   }92   93   /**94    *创建子进程并调用execve95    * v 希望接收到一个以NULL结尾的字符串数组的指针96    * e 函数传递指定参数envp允许改变子进程的环境无后缀e时子进程使用当前程序的环境97    */98   if( fork()  0 )99   {
100     printf(6------------execve-----------\n);
101     if( execve( /bin/ls, arg, NULL )  0)
102     {
103       perror(execve error );
104       exit(1);
105     }
106   }
107   return EXIT_SUCCESS;
108 }  运行结果(linux) 1------------execl------------
.  ..  .deps  exec  exec.o  .libs  Makefile
2------------execv------------
.  ..  .deps  exec  exec.o  .libs  Makefile
3------------execlp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
4------------execvp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
5------------execle------------
.  ..  .deps  .libs  Makefile  exec  exec.o
6------------execve-----------
.  ..  .deps  .libs  Makefile  exec  exec.o
按回车继续