execv 函数的应用

execv函数族:系统来调用某程序模块
    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[]);
本质:1、调用此函数时(成功的执行),调用的进程模块会替换现有的进程信息。
元素为NULL
    2、execve才是系统内核函数,上述都会调用此函数来完成的功能
从指定路径下查找    
int execv(const char *path, char *const argv[]);
    path:可执行文件的路径
    argv:就是用户传递的参数  argv[0]  argv[1]  argv[2]注:最后一个数组    
int execl(const char *path, const char *arg, ...);        
    path:可执行文件的路径
    arg:传递的参数(一定要传递NULL)

   execv 通过 argv 来获取 ls -l /  的路径,来替代系统的 /bin/ls 路径.

#include<iostream>
#include<unistd.h>
using namespace std;
//进程:分配空间
int main()
{
	cout<<"程序开始执行啦,成为进程"<<endl;
	//需要执行某程序模块  a.out     a.out  a b c  
	char* argv[5]={"ls","-l","/",NULL};
	execv("/bin/ls",argv);//argv[0]  argv[1] argv[2]	
	int i=0;
	for(i=0;i<100;i++)
	{
		cout<<i<<endl;
	}
	cout<<"进程结束执行"<<endl;
}

  execvp 的"ls"从环境变量中查找某 ls (也可以是其他命令) .

#include<iostream>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
using namespace std;
int main()
{
//本进程:1、去执行ls可执行文件   2、求1-100的和
	cout<<"a.out开始执行啦"<<getpid()<<endl;

	//执行ls的可执行文件
	//创建子进程,在子进程执行 模块
	int pid=fork();
	if(pid>0)//父进程
	{
		wait(NULL);
	}
	else if(0==pid)//子进程模块:execv替换进程模块
	{
		char* argv[]={"ls","/",NULL};
		//绝对路径 
	//	execv("/bin/ls",argv);	
		//从环境变量中查找某模块  **p
		execvp("ls",argv);
		//execl("/bin/ls","ls","/",NULL);
	}
	//父子进程都会执行:子进程中ls替换了子进程的数据区和代码区
	int i=0,result=0;
	for(i=0;i<=100;i++)
	{
		result+=i;
	}	
	cout<<"1-100的和为:"<<result<<endl;
	cout<<"a.out进程执行完成啦\n"<<endl;
	return 0;
}

   管道,创建一个 pipe(fd); 的管道,创建了一个子进程,先关闭 fd[0] (fd[0]管道的读操作) , 再在 write 中写入到管道 fd[1] (管道的写操作) , 再在子进程中 , 进行对管道 fd[0] 进行 read 操作 , 把写入到管道里的信息读取出来 .

#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<string.h>
using namespace std;
int main()
{
	char str[100]="";
//1创建管道
	int fd[2];
	pipe(fd);	
//两个进程
	int pid=fork();
	if(pid>0)//父进程输入信息到管道
	{
		strcpy(str,"123456789");
		//关闭读取
		close(fd[0]);
		//父亲写入信息到管道中
		write(fd[1],str,strlen(str));
	}
	else if(pid==0)//子进程读取父程序的内容
	{
		//关闭写端
		close(fd[1]);
		//子进程从管道中读取信息
		char ch;
		while(read(fd[0],&ch,1)>0)
			cout<<ch<<endl;
	}
}

   实现简单的 shell 的命令  , 可以实现  a.out  -l  data.data   可以将data.data的文件信息读取出来 .

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
using namespace std;
int main()
{
	char title[]="[***********]$ ";
	char cmd[255]="";
	int pid;
	char* matter[100]={NULL};//100个地址
	int i=0;
	//父进程
	while(1)
	{
		cout<<title;//输出标题
		gets(cmd);//输入(以\n 空格字符作为字符串的结符串)
		//创建子进程
		pid=fork();
		if(pid>0)
		{
			//等待子进程结束
			wait(NULL);
		}
		else if(0==pid)
		{	
			//解析字符串:
			matter[i]=strtok(cmd," ");
			while((matter[++i]=strtok(NULL," "))!=NULL);
			//替换子进程的信息
			execvp(matter[0],matter);
		}
	}
	return 0;
}

      为你翘课的那一天  花落的那一天
教室的那一间  我怎么看不见
    消失的下雨天  我好想再淋一遍
《晴天》

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值