lv5 嵌入式开发-2 exec函数族

2023-09-18 23:14:46

目录

1 进程 – exec函数族

1.1 exec函数族特点 

1.2 进程 – execl / execlp使用方法

1.3 进程 – execv / execvp

2 进程 – system

3 exec族要点演示


掌握:exec函数族、system

1 进程 – exec函数族

执行程序,通孔ps -elf发现,父进程是bash。这意味着该进程是由一个 bash shell 中启动的。

1.1 exec函数族特点 

  • 进程调用exec函数族执行某个程序
  • 进程当前内容被指定的程序替换(重要特点)
  • 实现让父子进程执行不同的程序(fork父子进程执行的是一个程序,下面是操作方法即原理)

       -父进程创建子进程

       -子进程调用exec函数族

       -父进程不受影响

1.2 进程 – 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中查找(需要环境变量中添加

示例1:

执行ls命令,显示/etc目录下所有文件的详细信息

if(execl(“/bin/ls”, “ls”, “-a”, “-l”, “/etc”, NULL) < 0){
    perror(“execl”);
}  
  
if(execlp(“ls”, “ls”, “-a”, “-l”, “/etc”, NULL) < 0){   
    perror(“execlp”);
}  

0号参数即使命令本身,后面再加其他参数

最后参数必须加NULL空指针

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

int main(){

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


}

1.3 进程 – execv / execvp

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

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

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

示例:

执行ls命令,显示/etc目录下所有文件的详细信息   

char  *arg[] = {“ls”, “-a”, “-l”, “/etc”, NULL};  
   
if(execv(“/bin/ls”, arg) < 0)
{      
    perror(“execv”);   
}       

if(execvp(“ls”, arg) < 0) 
{      
    perror(“execvp”);   
}  
#include <stdio.h>
#include <unistd.h>

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

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


}


linux@linux:~/Desktop$ ./a.out 
total 24
drwxr-xr-x  2 linux linux 4096 Sep 18 10:32 .
drwxr-xr-x 22 linux linux 4096 Sep 18 10:32 ..
-rwxrwxr-x  1 linux linux 7330 Sep 18 10:32 a.out
-rw-rw-r--  1 linux linux  184 Sep 16 11:24 fork.c
-rw-rw-r--  1 linux linux  157 Sep 18 10:32 test.c
linux@linux:~/Desktop$ ls -a -l ./
total 24
drwxr-xr-x  2 linux linux 4096 Sep 18 10:32 .
drwxr-xr-x 22 linux linux 4096 Sep 18 10:32 ..
-rwxrwxr-x  1 linux linux 7330 Sep 18 10:32 a.out
-rw-rw-r--  1 linux linux  184 Sep 16 11:24 fork.c
-rw-rw-r--  1 linux linux  157 Sep 18 10:32 test.c
linux@linux:~/Desktop$ 

2 进程 – system

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

成功时返回命令command的返回值;失败时返回EOF  

当前进程等待command执行结束后才继续执行

其原理也是fork的子进程,执行完不会被替代

示例;

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

int main(){
	system("ls -a -l ./");
}

3 exec族要点演示

示例

//a.out
#include <stdio.h>
int main(int argc,char **argv){    
    printf("hello world %s,%s\n",argv[1],argv[2]);
}

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

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

int main(){

	printf("before exec\n");
	if(execlp("./a.out","./a.out","abc","def",NULL)<0){
		perror("execv");
	}
    printf("after exec\n");
		  	
}

printf没有执行,因为a.out把程序全部替换了。

如果想不被替换?

可以写一个子程序,使用exec

#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");

}

printf被打印出来了。 

更多推荐

ElasticSearch集群shard均衡策略

ES集群的rebalance和allocation功能,可以自动均衡集群内部数据、分配分片,保证各个节点间尽量均衡。但是,在高访问量或者节点宕机的情况下,大范围的rebalance会影响到集群性能。所以,调整好集群相关参数,是重中之重。1-shard分配策略集群分片分配是指将索引的shard分配到其他节点的过程,会在如

结合购物车功能,了解RedisTemplate中的BoundHashOperations源码

🧑‍💻作者名称:DaenCode🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······😎人生感悟:尝尽人生百味,方知世间冷暖。📖所属专栏:Redis相关源码分析专栏推荐专门

# 数据库开发-MySQL基础DDL-DML总结

数据库:英文为DataBase,简称DB,它是存储和管理数据的仓库。数据库管理系统(DataBaseManagementSystem,简称DBMS)DBMS是操作和管理数据库的大型软件。将来我们只需要操作这个软件,就可以通过这个软件来操纵和管理数据库了。需要给DBMS软件发送一条指令,告诉这个软件我们要执行的是什么样的

Keepalived+LVS负载均衡

Keepalived是一个用于实现高可用性的开源软件,它基于VRRP(VirtualRouterRedundancyProtocol)协议,允许多台服务器协同工作,以确保在某个服务器出现故障时服务的连续性。Keepalived的核心思想是将多台服务器配置成主服务器(MASTER)和备份服务器(BACKUP),它们共享一

计算机基础协议/概念:推送数据— —WebSocket与SSE;前端Blob/URL下载文件

计算机基础协议/概念:推送数据——WebSocket与SSE1WebSocket:双向通信1.1概念:通信过程①Upgrade:浏览器告知服务器升级为WebSocket协议②Switch:服务器升级成功后会返回101状态码③Communicate:浏览器和服务器就可以以WebSocket格式发送数据1.2实战:实现简易

GitHub上标星23K+的Redis进阶笔记(应用+原理+集群+拓展+源码)

先来看几道Redis面试题:redis为什么是key,value的,为什么不是支持SQL的?redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看)redis的持久化开启了RDB和AOF下重启服务是如何加载的?(10个人9个回答错误)redis如果做集群该如何规划?AKF/CAP如何实现和设计?10万

Android gradle dependency tree change(依赖树变化)监控实现

文章目录前言基本原理执行流程diff报告不同分支merge过来的diff报告同个分支产生的merge报告同个分支提交的diff报告具体实现原理我们需要监控怎样的Dendenpency变化怎样获取dependencyTree`project.configurations`方式./gradlewdependenciesAs

Git常用命令diff和mv

Git常用命令diff和mv1、diff#查看工作区和暂存区所有文件的对比#该命令可以显示尚未添加到stage的文件的变更$gitdiff#查看工作区和暂存区单个文件的对比$gitdifffile#显示暂存区和上一个commit的差异#查看暂存区与指定提交版本的不同,版本可缺省为HEAD$gitdiff--cached

Spring常考知识点(IOC、事务、容器等)

Spring需要理解的问题谈谈你对IOC的理解单例Bean和单例模式Spring事务传播机制Spring事务什么时候会失效Spring中的Bean创建的⽣命周期有哪些步骤Spring中Bean是线程安全的吗ApplicationContext和BeanFactory有什么区别Spring中的事务是如何实现的Spring

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录一、环境准备二、基础软件三、扩展:usb拓展插件一、环境准备1、下载VMware虚拟机的壳子,安装并注册软件(可以百度注册码),最新版本:v172、下MacOS系统iOS镜像文件,用于vmware虚拟机安装,当前镜像最新版本:v11.6二、基础软件1、MacOS系统找到AppStore,这点同iphone操作,

.NET的CancellationTokenSource和ManualResetEvent结合使用

一、CancellationTokenSource是C#中的一个类,用于取消异步操作。它提供了一种机制,可以取消一个或多个异步操作。CancellationTokenSource包含以下主要方法:Cancel():该方法会取消所有挂起的操作,并引发OperationCanceledException异常。如果在调用Ca

热文推荐