热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux系统编程——exec族函数和system函数

一,exec族函数当我们用fork创建子进程后,经常调用exec族函数去执行新的可执行文件。注:调用exec族函数并不创建新进程所以进程

一,exec族函数

当我们用fork创建子进程后,经常调用exec族函数去执行新的可执行文件。
注:调用exec族函数并不创建新进程所以进程ID不变。

exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe

#include
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族函数调用成功后不会返回,失败返回-1;
函数参数值说明:
path:可执行文件所在路径(/绝对路径比如/bin/ls ./当前路径)
arg:可执行程序所带参数,第一个为可执行文件名,第二个即为参数,没有带路径必须以NULL结尾比如:execl("./bin/echoarg",“echoarg”,“abc”,NULL)。
file:如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,在它所指定的各目录中搜寻可执行文件。
exec族函数参数极难记忆和分辨,函数名中的字符会给我们一些帮助:
l : 使用参数列表
p:使用文件名,并从PATH环境进行寻找可执行文件
v:应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。
e:多了envp[]数组,使用新的环境变量代替调用进程的环境变量

带l(参数列表)得exec组函数(以execl函数为例)文件参数必须以NULL结尾

#include
#include
#include // int execl(const char *path, const char *arg, ...int main(void)
{printf("test before!\n");if(execl("/bin/ls","ls",NULL,NULL) == -1){printf("execl failed!\n");perror("why");}printf("test after!\n");return 0;
}
~

执行结果:

test before!
10.c 11.c 12.c 13.c 1.c 2.c 3.c 4.c 5.c 6.c 7.c 8.C 9.c a.out test test.c

如果execl函数不指定路径名,执行结果如下

#include
#include
#include // int execl(const char *path, const char *arg, ...int main(void)
{printf("test before!\n");if(execl("/bin/ls","ls",NULL,NULL) == -1){printf("execl failed!\n");perror("why");}printf("test after!\n");return 0;
}

结果:

test before!
execl failed!
why: No such file or directory
test after!

但是调用带p函数,以execlp函数为例则无需指定可执行文件路径(如果此路径包含在环境变量PATH中)

#include
#include
#include // int execlp(const char *file, const char *arg, ...);int main(void)
{printf("test before!\n");if(execlp("ls","-l",NULL) == -1){printf("execl failed!\n");perror("why");}printf("test after!\n");return 0;
}

如果是在环境变量下,可以直接运行,如果不是,调用带P函数的时候需要,将所要执行的可执行文件添加到环境变量:
使用pwd命令得到当前路径
使用echo $PATH命令查看当前环境变量PATH
使用sudo export PATH=$PATH:(可执行文件路径)

带v不带l的一类exac函数,包括execv、execvp、execve,应先构造一个指向各参数的指针数组,然后将该数组的地址作为这些函数的参数。

//文件execvp.c
#include
#include
#include
//函数原型:int execvp(const char *file, char *const argv[]);int main(void)
{printf("before execlp\n");char *argv[] = {"ls","-l",NULL};if(execvp("lS",argv) == -1) {printf("execvp failed!\n"); }printf("after execlp\n");return 0;
}

注:exec族函数调用失败是会产生一个错误码可以用perror()函数来查看;
二,system函数(封装后的exec函数)
直接将需要执行的命令格式作为参数输入:

#include
#include
#include int main(void)
{printf("test before!\n");system("ls -l");printf("test after!\n");return 0;
}

直接调用指令ls -l
三,popen函数(和system相比它可以获取运行结果)
popen执行玩命令后将结果放在管道中以流的形式读取进一个数组,并且不会在终端显示命令执行结果(system会把所有结果打印在终端上)
如system函数结果

test before!
10.c 11.c 12.c 13.c 14.c 15.c 1.c 2.c 3.c 4.c 5.c 6.c 7.c 8.C 9.c a.out test test.c
test after!

popen函数代码

#include
#include
#include int main(void)
{char str[1024] = {0};FILE *fp;fp = popen("date","r");int n_read = fread(str,1,1024,fp);printf("read str %d byte,str = %s \n",n_read,str);return 0;
}

代码执行结果如下(输出数组str)

read str 29 byte,str = Sat Aug 22 08:50:16 PDT 2020

如果不输出数组则在终端不输出结果!


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
author-avatar
阿川那小子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有