本文章为个人的学习笔记,其中有些知识点解释得不是那么的标准。
即本文章笔记可参考、可借鉴、可指点!
族函数
在当前进程中或者当前程序中调用exec函数时,则会去执行族函数内另外的一个程序。当调用exec族函数时,当前进程或执行的程序就会被完全替换为族函数该执行的程序,而族函数的调用多用在创建新的进程时的调用。因为调用exec族函数并不创建新进程,所以前后进程的ID并没有改变。通过调用族函数去执行的程序时,执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
族函数原型
#include <unistd.h>
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[]);
exec族函数执行成功后不会返回,且调用成功之后就会跳转至族函数里面的执行文件,而当前程序就不再继续执行;调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。
参数:
const char *path 为调用某执行文件的路径
const char *file 如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻该可执行文件。
const char *arg 第一个为执行文件的名称,第二个为执行文件的附加名称,依次类推;eg:ls -l等。如果没有参数了就得亦NULL来结尾。
char *const argv[ ] 也为执行文件的名称等,和上面那个参数十一月的,但是该参数是用数组来表达了。
直接上代码对比吧
system函数
int system(const char *command);
system 函数使用简单粗暴,直接去执行参数代表的执行文件,但是该文件必须是在当前函数的路径下。
system函数与execl族函数的最大的区别是,system调用完成之后,依旧会执行当前程序后面的程序,而族函数就会直接跳转到另一个可执行的文件去了,当调用完成之后并不会继续执行当前函数剩余的程序。
调用system时,他是创建新的一个进程来实现的,在这个子进程中调用/bin/sh -c来执行command指定的命令;当sh -c如果不能执行,则返回127;如果调用失败,则返回-1.
//int system(const char *command);
int main()
{
printf("this system-ps start !\n");
if(system("ps")==-1)
{
printf("system-ps failed !\n");
perror("error ");
}
printf("this system-ps end !\n");
return 0;
}
popen 函数
原型
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
如果 type 为 r,那么调用进程读进 command 的标准输出。一般用 r 。
如果 type 为 w,那么调用进程写到 command 的标准输入。
popen 是可以将执行的结果通过文件流读取出来,但是如果不读取操作的话,那终端也不会打印执行结果。