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

时间: 2024-11-12 09:56:32

进程相关函数-exec等的相关文章

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

(转载)Linux进程控制——exec函数族

1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., cha

Linux进程fork,exec,vfork详解

在Unix/Linux系统下进程创建时需要进行如下系统调用:fork/exec fork()把一个进程复制成二个进程:parent (old PID), child (new PID) exec()用新程序来重写当前进程:PID没有改变 接下来就重点学习这两个系统调用: 当我们fork() 创建一个继承的子进程将会发生如下事情:复制父进程的所有变量和内存,复制父进程的所有CPU寄存器(有一个寄存器例外)(这个寄存器是用来区分父进程和子进程的PID) fork()的返回值:调用fork()函数成功

【Linux 进程】exec族函数详解

exec族的组成: 在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg

第6章 进程控制(3)_wait、exec和system函数

5. 等待函数 (1)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); 返回值 成功返回子进程ID,出错返回-1 功能 等待子进程退出并回收,防止僵尸进程的产生 参数 (1)status参数: ①为空时,代表任意状态结束的子进程: ②不为空时,则等待指

Linux系统编程_9_进程控制之exec 函数

exec函数 当进程调用exec函数时,该进程的执行程序完全的替换为新程序.新程序从它的main函数开始执行: 使用fork函数创建一个子进程后,子进程往往会使用exec函数去执行另一个程序. 注意:调用exec函数并不会创建新进程,所以创建前后的进程ID不会改变,exec只是用一个全新的程序替换了当前正在运行的程序的代码段.数据段.堆.栈. #include <unistd.h> extern char **environ; int execl(const char *path, const

读书笔记-APUE第三版-(8)进程控制

进程ID 每一个进程都有一个唯一的进程ID.几个特殊进程: 0号进程是内核进程,一般是调度进程swapper. 1号进程init,是用户进程(以root权限执行/sbin/init),负责初始化. 几个重要函数:getpid(进程ID)/getppid(父进程ID)/getuid(进程真有用户ID)/geteuid(进程有效用户ID)/getgid(进程真有用户组ID)/getegid(进程有效用户组ID). fork/exec/wait例程 fork家族函数用于创建子进程(父子进程关系下节详细

Linux 进程(一):环境及其控制

进程环境 main启动 当内核执行C程序时,在调用main前先调用一个特殊的启动例程.可执行程序将此启动例程指定为程序的起始地址,接着启动例程从内核中取出命令行参数和环境变量值,然后执行main函数. 进程终止 使进程终止的方式有8种,其中5种为正常终止,3种为异常终止: 终止类型 说明 正常终止 (1)   从main返回 (2)   调用exit (3)   调用_exit或_Exit (4)   最后一个线程从启动例程返回 (5)   在最后一个线程中调用pthread_exit 异常终止

进程和线程及Linux下的编程

一.概述 进程和线程网络上有一堆解释,我不喜欢抄袭,也不喜欢套用太教科书的说法.就以我自己的理解来说说进程和线程吧,当然自己的理解肯定不是很严谨,但是理解起来应该会比教科书快一点.进程和线程都可以认为是并发执行程序,但是只有多处理器下的多线程才可以真正实现并发(多个线程在同一个时间片同时运行),其他的实际上并不是真正的并发,都是交替在cpu上运行,只是每个程序运行的时间很短(时间片),快速的交替,所以看上去就是同时在运行(并发). 几乎是同样的效果,为什么又分为进程和线程呢?进程和线程最大的区别