Linux 进程—族函数、system、popen

本文章为个人的学习笔记,其中有些知识点解释得不是那么的标准。

即本文章笔记可参考、可借鉴、可指点!


族函数

在当前进程中或者当前程序中调用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 是可以将执行的结果通过文件流读取出来,但是如果不读取操作的话,那终端也不会打印执行结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值