exec系函数
Posix标准制定的exec系列的函数主要有六个,它们的声明新式如下:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
这些函数的作用是利用一个新的进程镜像(process image)来替代当前的进程镜像。
主要说明一下execlp函数,它的第一个参数file用于制定可执行的文件名,第二个参数arg以及后面的可变参都是传递给该可执行文件的参数,由于是可变参数,所以最后一个参数必须以(char*)NULL结尾。该函数如果成功执行,由于是替代当前的进程,所以函数调用语句之后的代码就不会再被执行了。
这里需要注意的是传递的参数,一般情况下,execlp函数的前两个参数一样,都是可执行文件名。我们考虑带参数的main函数的执行情况,argv[0]指代的实际上是可执行文件名,其后的argv[1]~~argv[n]才是真正传递给它的参数。所以为了保持一致性,由于arg参数以及其后的可变参才是传递给执行程序的参数,所以,arg参数最好传递可执行文件的名字,就是是和file参数保持一致。
进程时间
linux下获取的进程时间主要分为以下三类:时钟时间(clock time),用户CUP时间(user CPU time),系统CPU时间(system CPU time)
在说它们之间的区别,我们首先来回顾下进程的三种基本状态:运行,就绪,阻塞。所谓时钟时间其实就是进程从执行开始到结束真实经历的时间,所以:
时钟时间 = 阻塞时间 + 就绪时间 + 运行时间
而我们知道进程的执行分为管态和目态,前者是内核调用函数执行的状态,后者则是用户代码执行时的状态,所以:
用户CPU时间 = 运行状态下的用户空间时间
系统CPU时间 = 运行状态下系统空间的时间
linux运行环境限制
unix中有以下三种限制:
(1)编译时限制(头文件)
(2)不与文件或目录相关联的运行时限制(sysconf函数)
(3)与文件或目录相关联的运行时限制(pathconf函数和fpahtconf函数
(1)编译时限制(头文件)
(2)不与文件或目录相关联的运行时限制(sysconf函数)
(3)与文件或目录相关联的运行时限制(pathconf函数和fpahtconf函数
第一种是属于编译时限制,这类限制一般都作为宏定义在头文件中,例如CHAR_MAX等,关键是后两种限制,它们属于运行时的环境限制,需要使用以下三种函数进行检测:
long sysconf(int name);
long pathconf(const char *pathname, int name);
long fpathname(int filedes, int name);
它们是用来检测linux运行环境的限制的,成功返回响应值,出错则返回-1。
第一个函数是检测不与文件或目录相关联的运行时限制,例如OPEN_MAX,它返回用户可打开文件的最大数量。
而后两个函数则是分别用于检测与目录或文件相关联的运行时限制,例如LINK_MAX,它返回文件链接数的最大值。