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 else 21 { 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时,会将信息写入此结构体指针指向的缓冲区。