首页 > 代码库 > 进程相关函数-exec等

进程相关函数-exec等

1.

exec函数

#include<unistd.h>int execl(const char *pathname,const char *arg,...);int execlp(const char *filename,const char *arg,...);int execle(const char *pathname,const char *arg,...,char *const envp[]);int execv(const char *pathname,char *const argv[]);int execvp(const char *filename,char *const argv[]);int execve(const char *filename,char *const argv[],char *const envp[]);

带l的参数不固定,

带p的会自动在环境变量中搜索路径,

带v则是用argv[],

带e的多一个envp[]指定环境变量。

调用成功不返回值,否则返回-1

 

注意:可能主函数的标准形式是

int main(int argc,char *argv[] , char *envp[]);

示例:

 1 #include<stdio.h> 2  3 int main(int argc,char *argv[],char *envp[]) 4 { 5     printf("###  ARGC ###\n%d\n",argc); 6     printf("###  ARGV ###\n"); 7     while(*argv) 8     { 9         printf("%s\n",*(argv++));10     }11     printf("###  ENVP ###\n");12     while(*envp)13     {14         printf("%s\n",*(envp++));15     }16     return 0;17 }

 

使用注意事项,

当使用有p的变量时,不需要完整路径,因为会在原始PATH中找。

使用有e的时候需要使用envp数组,char *envp[]={"path1",...,NULL}

使用有v的时候需要使用argv数组,char *argv[]={"cmd",....,NULL};

使用有l的时有需要把参数挨个罗列。绝对地址,命令名,参数,和结尾的NULL

 

 

2.

exit函数

#include<stdlib.h>void exit(int status);

终止本进程的运行。

也可以使用_exit()来代替exit,区别是_exit不进行现场清理,直接进入kernel(内核),且是POSIX.1定义的,不在ANSI C中

一般使用exit会使得数据相对安全,不至于丢失缓存区内的数据

 

3.

wait和waitpid函数

#include<sys/types.h>#include<sys/wait.h>pid_t wait(int *status);pid_t waitpid(pid_t pid,int *status,int options);

 

通过wait可以收集僵尸进程的信息然后销毁进程残留。

例子:

 1 #include<sys/types.h> 2 #include<sys/wait.h> 3  4 #include<unistd.h> 5 #include<stdio.h> 6 #include<stdlib.h> 7  8 int main(void) 9 {10     pid_t pc,pr;11     if((pc=fork())<0)12     {13         exit(1);14     }15     else if(pc == 0)16     {17         printf("child pid is %d\n",getpid());18         sleep(3);19     }20     else21     {22         pr=wait(NULL);23         printf("parent pid is %d\n",getpid());24     }25     return 0;26 }

 

此时只有子进程休眠完毕才会继续执行父进程,因为wait调用的时候会产生阻塞,只有发现僵尸进程才会继续执行。否则会一直阻塞在当前代码处直到捕捉到僵尸进程。

 

对于waitpid,捕捉到进程则返回pid号,否则返回0

 

对于pid参数,若>0,则值等待此进程。

若pid=-1,等待任意子进程退出。

若pid=0,等待同一个进程组中的子进程,

若pid<-1等待pid绝对值ID的进程组的任意子进程。

 

options不想使用可以用0

否则参数只有

WNOHANG,不会阻塞的使用wait,即之收集调用的时间之前的僵尸进程并销毁。

WUNTRACED,一般不用,主要在调试中使用。

二者可以的使用 | 同时使用。

 

实际上wait就是waitpid包装得到的,此时pid=-1.,options=0

 

针对与status的常用宏函数

WIFEXITED(status);

子进程正常退出时,返回一个非0值

 

WEXITSTATUS(status);

返回进程退出的代码,需要上述宏函数返回成功

 

还有两个叫做wait3和wait4的函数,此两个函数提供了与wait和waitpid相同的用法,最后提供了一个结构体参数,struct rusage *rusage;

当进程占用的资源不为NULL时,会将信息写入此结构体指针指向的缓冲区。

 

进程相关函数-exec等