进程、线程和进程间通信-进程基础2

进程 – exec函数族

背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码

作用:执行指定的程序

  进程调用exec函数族执行某个程序

进程当前内容被指定的程序替换

实现让父子进程执行不同的程序

 父进程创建子进程  

子进程调用exec函数族   父进程不受影响

进程 – execl / execlp

  #include  <unistd.h>
  int execl(const char *path, const char *arg, …);
  int execlp(const char *file, const char *arg, …);

 成功时执行指定的程序;失败时返回EOF

 path   执行的程序名称,包含路径

 arg…  传递给执行的程序的参数列表

 file   执行的程序的名称,在PATH中查找

注意:两个函数区别execlp不需要写文件名全路径,在PATH查找

    最后一个参数必须用空指针(NULL)作结束

进程当前内容被指定的程序替换,但进程号不变

第0个参数必须要写,虽然它没有使用

#include <stdio.h>
#include <unistd.h>

int main(){

   printf("before exec\n");
   if(execlp("ls","ls","-a","-l","./",NULL)<0){
	perror("execl");
   }

}

进程 – execv / execvp

  #include  <unistd.h>
  int execv(const char *path, char *const argv[]);
  int execvp(const char *file, char *const argv[]);

 成功时执行指定的程序;失败时返回EOF

 arg… 封装成指针数组的形式

#include <stdio.h>
#include <unistd.h>

int main(){
   char *agv[] = {"ls","-a","-l","./",NULL};

   if(execv("/bin/ls",agv)<0){
	perror("execv");
   }
}

进程 – system

  #include  <stdlib.h>
  int system(const char *command);

 成功时返回命令command的返回值;

失败时返回EOF  当前进程等待command执行结束后才继续执行

#include <stdio.h>
#include <stdlib.h>

int main(){
	system("ls -a -l ./");
}
#include <stdio.h>
#include <unistd.h>

int main(){
   pid_t pid;
   printf("before exec\n");
   pid = fork();
   if(pid==0){
   	if(execl("/bin/ls","-a","-l","./",NULL)<0){//子进程执行不同的程序
		perror("execl");
   	}
   }
   	printf("after execl\n");
  

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值