进程篇—exec函数族

进程篇—exec函数族

关键字:exec函数族

首先,我们来看一下什么是exec函数族?
所谓exec函数族,就是以exec开头的函数,比如execl函数、execlp函数等,所以称它为exec函数族。
在exec函数族中,一般是由fork创建子进程后,在子进程中执行,也就是替换子进程中的东西,进程中的空间代码完全被新程序代替,但是调用exec程序不会创建新进程,进程ID也没有发生变化
接下来,我们来看一下函数原型:

#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,
           ..., 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开头,我们来分别说一下后面几个数字:
l代表的是list:命令行参数列表
p代表的是path:搜索file时的使用的path变量
v代表的是vector:使用命令行参数数组
e代表的是environment:使用环境变量数组
好了,我们看看程序:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6     pid_t pid;
  7     pid = fork();
  8     if(pid==-1)
  9     {
 10         perror("error");
 11         exit(1);
 12     }
 13     else if(pid>0)
 14     {
 15         sleep(1);
 16         printf("father\n");
 17     }
 18     else{
 19         execlp("ls","ls","-l",NULL);                                        
 20     }
 21     return 0;
 22 }

结果:

-rwxrwxr-x 1 wz wz 7521  514 12:57 execl
-rw-rw-r-- 1 wz wz  255  514 12:56 execl.c
-rwxrwxr-x 1 wz wz 7484  513 23:55 fork
-rwxrwxr-x 1 wz wz 7526  513 23:34 fork1
-rw-rw-r-- 1 wz wz  348  513 23:34 fork1.c
-rw-rw-r-- 1 wz wz  311  513 20:27 fork.c
-rwxrwxr-x 1 wz wz 7339  51 15:57 practice
-rw-rw-r-- 1 wz wz   88  51 15:57 practice.c
-rwxrwxr-x 1 wz wz 8566  513 10:34 vfork
-rw-rw-r-- 1 wz wz  309  54 14:20 vfork.c
father

由上面的代码可知,这段代码实现的就是在子进程中实现对目录下的文件进行打印,也就是在shell终端命令——ls,其他的函数都是大同小异,就不多说了。接下来,我们自己编一个函数,命名hellow,我们来实验一下:

  1 #include<stdio.h>                                                           
  2 int main()
  3 {
  4     printf("hello\n");
  5     printf("hello\n");
  6     return 0;
  7 }

然后编写execl程序:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6     pid_t pid;
  7     pid = fork();
  8     if(pid==-1)
  9     {
 10         perror("error");
 11         exit(1);
 12     }
 13     else if(pid>0)
 14     {
 15         sleep(1);
 16         printf("father\n");
 17     }
 18     else{
 19     //  execlp("ls","ls","-l",NULL);
 20     execl("/home/wz/code/hello","hello",NULL);                              
 21     }
 22     return 0;
 23 }

得到的结果是:

hello
hello
father

由此可知,可以进行程序执行,接下来,我们把刚才的ls打印的命令存储在文件中,我们使用的是dup2函数,函数具体使用,可以使用man dup2来查看:

  1 #include<unistd.h>
  2 #include<stdlib.h>
  3 #include<stdio.h>
  4 #include<fcntl.h>
  5 
  6 int main()
  7 {
  8     int fd;
  9     fd = open("ls.out",O_WRONLY|O_CREAT|O_TRUNC,0644);    
 10     if(fd<0)
 11     {
 12         perror("error");
 13         exit(1);
 14     }
 15     dup2(fd,STDOUT_FILENO);
 16     execlp("ls","ls","-l",NULL);                                            
 17     return 0;
 18 }
~       

结果就是产生一个文件,执行cat ls.out就可以看到和刚才第一个程序的结果是一样的。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值