2022-1-14 牛客C++项目 —— exec函数族学习

复习时候用的问题:
1、函数族是什么?
2、exec 函数族的作用是什么?
3、如果在父进程函数里面使用 exec 会有什么样的结果?有什么更好的做法?
4、execl 函数、execlp 函数

函数族是一些功能相同或者相似的函数,由于 C语言当中没有函数重载,所以使用函数族。
在这里插入图片描述
如果在父进程函数里面使用 exec 会有什么样的结果?有什么更好的做法?
若执行成功,会造成exec函数之后的原先的进程调用的实体被新调用的进程实体替换掉,如果需要使用原先父进程之后的代码时没有可能的。
更好的方法是创建一个子进程,然后在子进程里面执行exec函数,子进程本来就是父进程的 clone ,被替换掉也没啥损失。

由下图可知,执行exec的时候将原先进程的用户区整个儿替换掉,之后再使用 a.out 的用户区接在原来进程的内核区上面。
在这里插入图片描述
exec函数族有哪些函数?
在这里插入图片描述
execl () 函数学习

/*
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
参数:-path:要执行的文件的路径名
        arg:要执行的可执行文件的参数列表
        比如 ./a.out a b c 
        第一个参数一般是可执行文件的名称
        后面的参数是传递给该可执行文件的参数。
        参数最后需要以NULL来标记参数列表的结束(用作哨兵)

返回值:只有调用失败才会有返回值,返回-1
如果调用成功不会有返回值(都被替换掉了,要个屁的返回值)        
*/
#include <unistd.h>
#include<sys/types.h>
#include<stdio.h>
int main(void){
    pid_t pid = fork();

    if(pid > 0){
        printf("i am parent process,pid = %d\n",getpid());
    }
    else if(pid == 0){
        execl("hw","hw",NULL);
        printf("i am child process, pid = %d\n",getpid());

    }
    for(int i = 0;i < 3;++i){
        printf("i = %d , pid = %d\n",i,getpid());
    }
    //猜测这个代码只会在父进程里面执行,pid为父进程的
    return 0;
}      

直接使用运行没有成功不知道为什么,用了 gcc 之后才成功。
直接使用运行的结果
在这里插入图片描述
使用了 gcc 之后的结果
在这里插入图片描述
但是为什么 hello_world 上面的内容没有打印在一块儿呢?
是因为有孤儿进程的产生,所以没有打印在一块儿。

要打印在一块儿,可以在父进程当中加上一个 sleep(1)
在这里插入图片描述
在这里插入图片描述
除了我们自己的可执行文件,也可以使用系统的可执行文件。

#include <unistd.h>
#include<sys/types.h>
#include<stdio.h>
int main(void){
    pid_t pid = fork();

    if(pid > 0){
        printf("i am parent process,pid = %d\n",getpid());
        sleep(1);
    }
    else if(pid == 0){
        //execl("hw","hw",NULL);
        //上面的是执行可执行文件,也可以执行shell命令
        execl("/bin/ps","aux",NULL);
        printf("i am child process, pid = %d\n",getpid());

    }
    for(int i = 0;i < 3;++i){
        printf("i = %d , pid = %d\n",i,getpid());
    }
    //猜测这个代码只会在父进程里面执行,pid为父进程的
    return 0;
}                    

在这里插入图片描述

execlp 函数

#include <unistd.h>
int execlp(const char *file, const char *arg, …);
会在环境变量中查找可执行文件的路径,如果找到了就执行,找不到就不执行。
参数:-file:需要执行的可执行文件的文件名
arg:要执行的可执行文件的参数列表
a.out a b c
ps
第一个参数一般是可执行文件的名称
后面的参数是传递给该可执行文件的参数。
参数最后需要以NULL来标记参数列表的结束(用作哨兵)

返回值:只有调用失败才会有返回值,返回-1
如果调用成功不会有返回值(都被替换掉了,要个屁的返回值)

int execv(const char *path, char *const argv[]);
使用字符串数组来传递参数
char *argv[] = {“a.out”,“a”,“b”,“c”,NULL}
execv("/bin/ps",argv);

int execvpe(const char *file, char *const argv[], char const envp[]);
最后一个参数是用于加上环境变量
char
envp[] = {"/home/three","/home/aaa"}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值