码迷,mamicode.com
首页 > 其他好文 > 详细

进程相关函数-exec等

时间:2014-09-04 20:42:40      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   使用   ar   for   数据   

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

 

进程相关函数-exec等

标签:style   blog   color   os   io   使用   ar   for   数据   

原文地址:http://www.cnblogs.com/lhyz/p/3955580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!