exec函数族

合集下载

exec族函数详解及循环创建子进程

exec族函数详解及循环创建子进程

exec族函数详解及循环创建⼦进程 前⾔:之前也知道exec族函数,但没有完全掌握,昨天⼜重新学习了⼀遍,基本完全掌握了,还有⼀些⽗⼦进程和循环创建⼦进程的问题,还要介绍⼀下环境变量,今天分享⼀下。

⼀、环境变量 先介绍下环境的概念和特性,再举例⼦吧。

环境变量,是指在中⽤来指定操作系统运⾏环境的⼀些参数。

通常具备以下特征: ①字符串(本质) ②有统⼀的格式:名=值[:值] ③值⽤来描述进程环境信息。

存储形式:与命令⾏参数类似。

char *[]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。

使⽤形式:与命令⾏参数类似。

引⼊环境变量表:须声明环境变量。

extern char ** environ; 环境变量跟很多东西有关系,例如接下来的exec族函数,这也是为什么要先介绍下环境变量的原因,对理解exec族函数很有帮助;例如,Linux是什么样的系统?多⽤户多任务开源系统,每个⽤户的登录信息环境变量都会记录。

举例⼀下常⽤的环境变量:PATH 可执⾏⽂件的搜索路径。

ls命令也是⼀个程序,执⾏它不需要提供完整的路径名/bin/ls,然⽽通常我们执⾏当前⽬录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值⾥⾯包含了ls命令所在的⽬录/bin,却不包含a.out所在的⽬录。

PATH环境变量的值可以包含多个⽬录,⽤:号隔开。

在Shell中⽤echo命令可以查看这个环境变量的值: $ echo $PATHSHELL 当前Shell,它的值通常是/bin/bash。

TERM 当前终端类型,在图形界⾯终端下它的值通常是xterm,终端类型决定了⼀些程序的输出显⽰⽅式,⽐如图形界⾯终端可以显⽰汉字,⽽字符终端⼀般不⾏。

LANG 语⾔和locale,决定了字符编码以及时间、货币等信息的显⽰格式。

HOME 当前⽤户主⽬录的路径,很多程序需要在主⽬录下保存配置⽂件,使得每个⽤户在运⾏该程序时都有⾃⼰的⼀套配置 介绍跟环境变量相关的函数: char *getenv(const char *name); //获取环境变量 int setenv(const char *name, const char *value, int overwrite); //添加或改变环境变量 int unsetenv(const char *name); //删除 ⼆、fork函数及循环创建⼦进程 先说⼀个问题,学会fork并写程序时,可能都会遇到⼀个问题如下: ./a.out的输出跑到终端上了,想过为什么?接下来我会解释这个问题。

Linux系统进程控制编程——exec函数族的使用

Linux系统进程控制编程——exec函数族的使用

Linux系统进程控制编程——exec函数族的使用Linux系统进程控制编程——exec函数族的使用exec用被执行的程序完全替换调用它的程序的影像。

fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,和调用exec函数的进程一样。

int exec…装入和运行其它程序:int execl( char *pathname, char *arg0, char *arg1,..., char *argn, NULL)int execle( char *pathname, char *arg0, char *arg1,..., char *argn, NULL, char *envp[])int execlp( char *pathname, char *arg0, char *arg1,..., NULL) int execlpe(char *pathname, char *arg0, char *arg1,..., NULL, char *envp[])int execv( char *pathname, char *argv[])int execve( char *pathname, char *argv[], char *envp[])int execvp( char *pathname, char *argv[])int execvpe(char *pathname, char *argv[], char *envp[])exec函数族装入并运行程序pathname,并将参数arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1在exec函数族中,后缀l、v、p、e添加到exec后,所指定的函数将具有某种操作能力有后缀:p时,函数可以利用DOS的PATH变量查找子程序文件。

假如你希望执行命令/bin/cat /etc/passwd /etc/group(通过cat命令查看/etc/passwd和/etc/group的内容)l时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志execl( "/bin/cat", "/etc/passed", "/etc/group", NULL);v时,希望接收到一个以NULL结尾的字符串数组的指针char* argv[] = {"/bin/cat", "/etc/passed", "/etc/group", NULL} execv( "/bin/cat", argv );e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。

c++中实现调用外部程序的方法linux__概述及解释说明

c++中实现调用外部程序的方法linux__概述及解释说明

c++中实现调用外部程序的方法linux 概述及解释说明1. 引言1.1 概述本篇文章旨在探讨在C++语言中如何调用外部程序,并着重介绍在Linux环境下的具体方法。

调用外部程序是在软件开发中常见的需求,通过调用外部程序可以实现更多功能和交互方式。

本文将从基本原理以及注意事项开始阐述,然后详细介绍在C++中实现调用外部程序的方法,并给出示例代码进行解析。

1.2 文章结构本文将按照以下结构组织内容:首先,在引言部分进行概述和明确目的;然后在第2节中,详细讲解在C++中调用外部程序的方法,包括基本原理和Linux环境下的注意事项;紧接着,在第3节中,将通过示例及代码解析展示具体的调用外部程序的实现过程;最后,在第4节中,介绍使用第三方库实现更复杂交互方式的方法,并给出相关示例;最后一节为结论与总结。

1.3 目的本文旨在提供读者关于C++语言中如何通过调用外部程序来扩展功能和实现更灵活交互方式方面的详尽解释。

通过了解基本原理以及学习具体实践案例,读者可获得掌握在C++中调用外部程序的能力。

另外,引入第三方库实现更复杂交互方式的方法也将拓宽读者的知识面和技能应用范围。

最终,通过全面而清晰地阐述调用外部程序的方法,本文旨在提供有关调用外部程序的详尽指南,并启示读者对未来可能发展方向的展望。

以上是关于文章“1. 引言”部分内容的详细说明。

2. 调用外部程序的方法:在C++中,调用外部程序是一种常见的需求,可以通过多种方式实现。

本节将介绍C++中调用外部程序的基本原理、在Linux环境下调用外部程序时需要注意的事项以及具体的实现方法介绍。

2.1 C++中调用外部程序的基本原理:在C++中,调用外部程序可以借助操作系统提供的系统调用或库函数来实现。

常见的方法包括使用system函数、使用fork和exec函数族以及使用popen 函数等。

2.2 Linux环境下调用外部程序的注意事项:在Linux环境下调用外部程序时,需要注意以下几个方面:- 文件路径:确保正确地指定待执行的外部程序文件路径,在使用相对路径时要考虑当前工作目录。

exec 的语法

exec 的语法

exec 的语法`exec` 是一个在多种编程语言中都存在的关键字或函数,用于执行存储在字符串或文件中的命令。

以下是几种常见编程语言中`exec` 的语法和使用方法:1. Python:```pythonimport osos.execv('/path/to/executable', args)```2. PHP:```phpexec('command', $output, $return_var);```或者:```php$output = array();exec('command', $output, $return_var);```3. Perl:```perlexec('command');```4. Shell (Bash):```bashexec command```5. Java: Java 不提供内建的`exec` 方法,但可以使用`ProcessBuilder` 或`Runtime.exec` 来执行外部命令。

6. C#: C# 中没有内建的`exec` 方法,但可以使用`System.Diagnostics.Process` 类来执行外部程序。

7. JavaScript (Node.js): 使用`child_process` 模块的`exec` 方法。

8. Ruby: 使用`Kernel#exec` 方法。

9. Golang: 使用`os/exec` 包。

10. Swift (iOS/macOS): 使用`Process` 类。

11. Rust: 使用`std::process::Command`。

12. Erlang: 使用`os:cmd/1` 函数。

13. C++: 使用`<cstdlib>` 或`<system>` 中的`system` 函数。

14. Dart: 使用`dart:io` 包的`Process` 类。

exec函数簇

exec函数簇

exec函数簇exec函数簇是UNIX和Linux系统中的一组系统调用,用于执行一个新的程序。

这些函数允许用户在运行时动态地替换正在运行的程序。

以下是exec函数簇中的一些常用函数:1. execve:这是最常用的exec函数,它执行一个新的程序,传递给它一个新的环境变量和参数列表。

'''cint execve(const char *filename, char *const argv[], char *const envp[]); '''2. execv:这个函数与execve类似,但它不接受环境变量参数。

'''cint execv(const char *filename, char *const argv[]);'''3. execp:这个函数与execve类似,但它允许用户在路径中搜索可执行文件。

'''cint execp(const char *file, char *const argv[], char *const envp[]);'''4. execle:这个函数与execve类似,但它允许用户传递一个环境变量列表。

'''cint execle(const char *filename, char *const argv[], char *const envp[]); '''5. execl:这个函数与execv类似,但它允许用户传递一个参数列表。

'''cint execl(const char *filename, char *const argv[]);'''6. execlp:这个函数与execp类似,但它允许用户传递一个参数列表。

'''cint execlp(const char *file, char *const argv[]);'''7. execlpe:这个函数与execlp类似,但它允许用户传递一个环境变量列表和一个参数列表。

exec函数簇

exec函数簇

exec 6种函数簇形式什么是exec函数?即它是一种将shell命令 C代码化的函数。

例如:[ls -l] C语言中无法直接使用,当用exec函数调用后,就可以实现。

exec函数的参数由NULL作为结尾。

笔记:①执行exec函数后,程序后面的代码都不会再执行。

如果在进程中执行,则该进程在执行exec函数后接收,进程外的代码不受影响。

②所需头文件:#include <unistd.h>一、int execl(const char *path, const char *arg, ...);使用方式:1.execl("/bin/ls","ls","-l","/etc/passwd",NULL); //提供绝对路径去寻找ls文件解释:从[/bin/ls]中找到ls文件,并调用[ls -l /etc/passwd],查找进程中带有[/etc/passwd]的文本行效果如下:二、int execlp(const char *file, const char *arg, ...); 使用方式:1.execlp("ls","ls","-l","/etc/passwd",NULL); //从PATH环境变量路径寻找ls文件解释:从[PATH环境]中找到ls文件,并调用[ls -l /etc/passwd],查找进程中带有[/etc/passwd]的文本行效果如下:三、int execle(const char *path, const char *arg, ..., char * const envp[]);四、int execv(const char *path, char *const argv[]);使用方式:1.char *exec_buf[]= {"ls","-l",NULL};2.execv("/bin/ls", exec_buf); //提供绝对路径寻找ls文件,并且参数以数组形式提供解释:从[/bin/ls]中找到ls文件,并调用[ls -l],查找所有进程效果如下:五、int execvp(const char *file, char *const argv[]);六、int execve(const char *path, char *const argv[], char *const示例:char *arrArg1[] = {"ls", "-l", NULL};char *arrEnv[] = {"PATH=/bin:/usr/bin", NULL};execl(“/bin/ls”,”ls”,”-l”,”/etc/passwd”,NULL);execlp(“ls”,”ls”,”-l”,”/etc/passwd”,NULL);execv("/bin/ls", arrArg1);execvp("ls", arrArg1);execve("/bin/ls", arrArg1, arrEnv);查看进程的状态: ps –auxUSER 进程的用户;PID 进程的ID;%CPU 进程占用的CPU百分比;%MEM 占用内存的百分比;VSZ 该进程使用的虚拟内存量(KB);RSS 该进程占用的固定内存量(KB);TTY 该进程在哪个终端上运行(登陆者的终端位置),若与终端无关,则显示(?)。

CC++——C语言库函数大全

CC++——C语言库函数大全

CC++——C语⾔库函数⼤全本⽂转载⾃:https:///yanfan0916/article/details/6450442###;1. 分类函数: ctype.hint isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回⾮0值,否则返回0int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回⾮0值,否则返回0int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回⾮0值,否则返回0int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返回⾮0值,否则返回0int isdigit(int ch) 若ch是数字('0'-'9')返回⾮0值,否则返回0int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回⾮0值,否则返回0int islower(int ch) 若ch是⼩写字母('a'-'z')返回⾮0值,否则返回0int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回⾮0值,否则返回0int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回⾮0值,否则返回0int isspace(int ch) 若ch是空格(' '),⽔平制表符('/t'),回车符('/r'),⾛纸换⾏('/f'), 垂直制表符('/v'),换⾏符('/n'),返回⾮0值,否则返回0int isupper(int ch) 若ch是⼤写字母('A'-'Z')返回⾮0值,否则返回0int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回⾮0值,否则返回0int tolower(int ch) 若ch是⼤写字母('A'-'Z')返回相应的⼩写字母('a'-'z')int toupper(int ch) 若ch是⼩写字母('a'-'z')返回相应的⼤写字母('A'-'Z')2. 数学函数: math.h 、 stdlib.h 、string.h 、float.hint abs(int i) 返回整型参数i的绝对值double cabs(struct complex znum) 返回复数znum的绝对值double fabs(double x) 返回双精度参数x的绝对值long labs(long n) 返回长整型参数n的绝对值double exp(double x) 返回指数函数e^x的值double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值double log(double x) 返回ln(x)的值double log10(double x) 返回log10(x)的值double pow(double x,double y) 返回x^y的值double pow10(int p) 返回10^p的值double sqrt(double x) 返回x的正平⽅根double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度double atan(double x) 返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度double sin(double x) 返回x的正弦sin(x)值,x为弧度double tan(double x) 返回x的正切tan(x)值,x为弧度double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度double hypot(double x,double y) 返回直⾓三⾓形斜边的长度(z), x和y为直⾓边的长度,z2=x2+y2 double ceil(double x) 返回不⼩于x的最⼩整数double floor(double x) 返回不⼤于x的最⼤整数void srand(unsigned seed) 初始化随机数发⽣器int rand() 产⽣⼀个随机数并返回这个数double poly(double x,int n,double c[])从参数产⽣⼀个多项式double modf(double value,double *iptr)将双精度数value分解成尾数和阶double fmod(double x,double y) 返回x/y的余数double frexp(double value,int *eptr) 将双精度数value分成尾数和阶double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数char *ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *fcvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *gcvt(double value,int ndigit,char *buf)将数value转换成字符串并存于buf中,并返回buf的指针char *ultoa(unsigned long value,char *string,int radix)将⽆符号整型数value转换成字符串并返回该字符串,radix为转换时所⽤基数char *ltoa(long value,char *string,int radix)将长整型数value转换成字符串并返回该字符串,radix为转换时所⽤基数char *itoa(int value,char *string,int radix)将整数value转换成字符串存⼊string,radix为转换时所⽤基数double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0int atoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数,long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数,并返回这个数, int matherr(struct exception *e)⽤户修改数学错误返回信息函数(没有必要使⽤)double _matherr(_mexcep why,char *fun,double *arg1p,double *arg2p,double retval)⽤户修改数学错误返回信息函数(没有必要使⽤)unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态void _fpreset() 重新初使化浮点数学程序包unsigned int _status87() 返回浮点状态字3. ⽬录函数: dir.h 、 dos.hint chdir(char *path) 使指定的⽬录path(如:"C://WPS")变成当前的⼯作⽬录,成功返回0int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的⽂件,成功返回0pathname为指定的⽬录名和⽂件名,如"C://WPS//TXT"ffblk为指定的保存⽂件信息的⼀个结构,定义如下:┏━━━━━━━━━━━━━━━━━━┓┃struct ffblk ┃┃{ ┃┃ char ff_reserved[21]; /*DOS保留字*/ ┃┃ char ff_attrib; /*⽂件属性*/ ┃┃ int ff_ftime; /*⽂件时间*/ ┃┃ int ff_fdate; /*⽂件⽇期*/ ┃┃ long ff_fsize; /*⽂件长度*/ ┃┃ char ff_name[13]; /*⽂件名*/ ┃┃} ┃┗━━━━━━━━━━━━━━━━━━┛attrib为⽂件属性,由以下字符代表┏━━━━━━━━━┳━━━━━━━━┓┃FA_RDONLY 只读⽂件┃FA_LABEL 卷标号┃┃FA_HIDDEN 隐藏⽂件┃FA_DIREC ⽬录┃┃FA_SYSTEM 系统⽂件┃FA_ARCH 档案┃┗━━━━━━━━━┻━━━━━━━━┛例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);int findnext(struct ffblk *ffblk) 取匹配finddirst的⽂件,成功返回0void fumerge(char *path,char *drive,char *dir,char *name,char *ext)此函数通过盘符drive(C:、A:等),路径dir(/TC、/BC/LIB等),⽂件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成⼀个⽂件名存与path中.int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)此函数将⽂件名path分解成盘符drive(C:、A:等),路径dir(/TC、/BC/LIB等),⽂件名name(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存⼊相应的变量中. int getcurdir(int drive,char *direc) 此函数返回指定驱动器的当前⼯作⽬录名称drive 指定的驱动器(0=当前,1=A,2=B,3=C等)direc 保存指定驱动器当前⼯作路径的变量成功返回0char *getcwd(char *buf,iint n) 此函数取当前⼯作⽬录并存⼊buf中,直到n个字节长为为⽌.错误返回NULLint getdisk() 取当前正在使⽤的驱动器,返回⼀个整数(0=A,1=B,2=C等)int setdisk(int drive) 设置要使⽤的驱动器drive(0=A,1=B,2=C等),返回可使⽤驱动器总数int mkdir(char *pathname) 建⽴⼀个新的⽬录pathname,成功返回0int rmdir(char *pathname) 删除⼀个⽬录pathname,成功返回0char *mktemp(char *template) 构造⼀个当前⽬录上没有的⽂件名并存于template中char *searchpath(char *pathname) 利⽤MSDOS找出⽂件filename所在路径,,此函数使⽤DOS的PATH变量,未找到⽂件返回NULL4. 进程函数: stdlib.h 、 process.hvoid abort() 此函数通过调⽤具有出⼝代码3的_exit写⼀个终⽌信息于stderr,并异常终⽌程序。

c++常用函数大全

c++常用函数大全

c++常用函数大全数学函数,所在函数库为math.h、stdlib.h、string.h、float.hint abs(int i) 返回整型参数i的绝对值double cabs(struct complex znum) 返回复数znum的绝对值double fabs(double x) 返回双精度参数x的绝对值long labs(long n) 返回长整型参数n的绝对值double exp(double x) 返回指数函数ex的值double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值double log(double x) 返回logex的值double log10(double x) 返回log10x的值double pow(double x,double y) 返回xy的值double pow10(int p) 返回10p的值double sqrt(double x) 返回+√x的值double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度整数void srand(unsigned seed) 初始化随机数发生器int rand() 产生一个随机数并返回这个数double poly(double x,int n,double c[])从参数产生一个多项式double modf(double value,double *iptr)将双精度数value分解成尾数和阶double fmod(double x,double y) 返回x/y的余数double frexp(double value,int *eptr) 将双精度数value分成尾数和阶double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数char *ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *fcvt(double value,int ndigit,int*decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *gcvt(double value,int ndigit,char *buf)将数value转换成字符串并存于buf中,并返回buf的指针char *ultoa(unsigned long value,char*string,int radix)将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *ltoa(long value,char *string,int ra dix)将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *itoa(int value,char *string,int rad ix)将整数value转换成字符串存入string,radix 为转换时所用基数double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0int atoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数, long strtol(char *str,char **endptr,int b ase)将字符串str转换成长整型数,并返回这个数,int matherr(struct exception *e)用户修改数学错误返回信息函数(没有必要使用)double _matherr(_mexcep why,char *fun,dou ble *arg1p,double *arg2p,double retval)用户修改数学错误返回信息函数(没有必要使用)unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态void _fpreset() 重新初使化浮点数学程序包unsigned int _status87() 返回浮点状态字目录函数,所在函数库为dir.h、dos.hint chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成功返回0int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功返回0pathname为指定的目录名和文件名,如"C:\\WPS \\TXT"ffblk为指定的保存文件信息的一个结构,定义如下:例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0void fumerge(char *path,char *drive,char *dir,char *name,char *ext)此函数通过盘符drive(C:、A:等),路径dir(\T C、\BC\LIB等),文件名name(TC、WPS等),扩展名ext(.EXE、.C OM等)组成一个文件名存与path中.int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)此函数将文件名path分解成盘符drive(C:、A:等),路径dir(\TC、\BC\LIB等),文件名name(TC、WPS等),扩展名ext(.EXE、.C OM等),并分别存入相应的变量中.int getcurdir(int drive,char *direc) 此函数返回指定驱动器的当前工作目录名称drive 指定的驱动器(0=当前,1=A,2=B,3=C等) direc 保存指定驱动器当前工作路径的变量成功返回0char *getcwd(char *buf,iint n) 此函数取当前工作目录并存入buf中,直到n个字节长为为止.错误返回NULLint getdisk() 取当前正在使用的驱动器,返回一个整数(0=A,1=B,2=C等)int setdisk(int drive) 设置要使用的驱动器drive(0=A,1=B,2=C等),返回可使用驱动器总数int mkdir(char *pathname) 建立一个新的目录pathname,成功返回0int rmdir(char *pathname) 删除一个目录pat hname,成功返回0char *mktemp(char *template) 构造一个当前目录上没有的文件名并存于template中char *searchpath(char *pathname) 利用MSD OS找出文件filename所在路径,,此函数使用DOS的PATH变量,未找到文件返回NULL进程函数,所在函数库为stdlib.h、process.h void abort() 此函数通过调用具有出口代码3的_exit写一个终止信息于stderr,并异常终止程序。

c语言库函数大全

c语言库函数大全

c语言库函数大全--资料收集分类函数,所在函数库为ctype.h include “stype.h”int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9'),返回非0值,否则返回0 int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F),返回非0值,否则返回0int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0 int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值, 否则返回0int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')数学函数,所在函数库为math.h、stdlib.h、string.h、float.hint abs(int i) 返回整型参数i的绝对值double cabs(struct complex znum) 返回复数znum的绝对值double fabs(double x) 返回双精度参数x的绝对值long labs(long n) 返回长整型参数n的绝对值double exp(double x) 返回指数函数ex的值double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值double log(double x) 返回logex的值double log10(double x) 返回log10x的值double pow(double x,double y) 返回xy的值double pow10(int p) 返回10p的值double sqrt(double x) 返回x的开方double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度double atan(double x) 返回x的反正切tan-1(x)值,x为弧度double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度double sin(double x) 返回x的正弦sin(x)值,x为弧度double tan(double x) 返回x的正切tan(x)值,x为弧度double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度double hypot(double x,double y) 返回直角三角形斜边的长度(z), x和y为直角边的长度,z2=x2+y2double ceil(double x) 返回不小于x的最小整数double floor(double x) 返回不大于x的最大整数void srand(unsigned seed) 初始化随机数发生器int rand() 产生一个随机数并返回这个数double poly(double x,int n,double c[]) 从参数产生一个多项式double modf(double value,double *iptr) 将双精度数value分解成尾数和阶double fmod(double x,double y) 返回x/y的余数double frexp(double value,int *eptr) 将双精度数value分成尾数和阶double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数char *ecvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *fcvt(double value,int ndigit,int *decpt,int *sign)将浮点数value转换成字符串并返回该字符串char *gcvt(double value,int ndigit,char *buf)将数value转换成字符串并存于buf中,并返回buf的指针char *ultoa(unsigned long value,char *string,int radix)将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *ltoa(long value,char *string,int radix)将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数char *itoa(int value,char *string,int radix)将整数value转换成字符串存入string,radix为转换时所用基数double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0int atoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0 double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数, long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数, 并返回这个数,int matherr(struct exception *e) 用户修改数学错误返回信息函数(没有必要使用)double _matherr(_mexcep why,char *fun,double *arg1p, double *arg2p,double retval)用户修改数学错误返回信息函数(没有必要使用)unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态void _fpreset() 重新初使化浮点数学程序包unsigned int _status87() 返回浮点状态字目录函数,所在函数库为dir.h、dos.hint chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成功返回0int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功返回0pathname为指定的目录名和文件名,如"C:\\WPS\\TXT"ffblk为指定的保存文件信息的一个结构,定义如下:┏━━━━━━━━━━━━━━━━━━┓┃struct ffblk ┃┃{ ┃┃char ff_reserved[21]; /*DOS保留字*/┃┃char ff_attrib; /*文件属性*/ ┃┃int ff_ftime; /*文件时间*/ ┃┃int ff_fdate; /*文件日期*/ ┃┃long ff_fsize; /*文件长度*/ ┃┃char ff_name[13]; /*文件名*/ ┃┃} ┃┗━━━━━━━━━━━━━━━━━━┛attrib为文件属性,由以下字符代表┏━━━━━━━━━┳━━━━━━━━┓┃FA_RDONLY 只读文件┃FA_LABEL 卷标号┃┃FA_HIDDEN 隐藏文件┃FA_DIREC 目录┃┃FA_SYSTEM 系统文件┃FA_ARCH 档案┃┗━━━━━━━━━┻━━━━━━━━┛例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0void fumerge(char *path,char *drive,char *dir,char *name,char *ext)此函数通过盘符drive(C:、A:等), 路径dir(\TC、\BC\LIB等), 文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名存与path中.int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)此函数将文件名path分解成盘符drive(C:、A:等), 路径dir(\TC、\BC\LIB等), 文件名na me(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存入相应的变量中.int getcurdir(int drive,char *direc)此函数返回指定驱动器的当前工作目录名称。

exec函数族

exec函数族
perror( "execl error " ); exit(1); } }
/** *创建子进程并调用函数 execv *execv 中希望接收一个以 NULL 结尾的字符串数组的指针 */ if( fork() == 0 ) { // in child printf("2------------execv------------\n"); if( execv( "/bin/ls",arg) < 0) {
字母 p 是指在环境变量 PATH 的目录里去查找要执行的可执行文件。2 个以 p 结尾的函数 execlp 和 execvp,看起来,和 execl 与 execv 的差别很小,事实也如此,它们的区别从第一 个参数名可以看出:除 execlp 和 execvp 之外的 4 个函数都要求,它们的第 1 个参数 path 必须是一个完整的路径,如"/bin/ls";而 execlp 和 execvp 的第 1 个参数 file 可以仅仅只是 一个文件名,如"ls",这两个函数可以自动到环境变量 PATH 指定的目录里去查找。
函数名与参数的关系: 细看一下,这 6 个函数都是以 exec 开头(表示属于 exec 函数组),前 3 个函数接着字母 l 的,后 3 个接着字母 v 的,我的理解是 l 表示 list(列举参数),v 表示 vector(参数向量表) 。它们的区别在于,execv 开头的函数是以"char *argv[]"(vector)形式传递命令行参数,而 execl 开头的函数采用了罗列(list)的方式,把参数一个一个列出来,然后以一个 NULL 表示 结束。这里的 NULL 的作用和 argv 数组里的 NULL 作用是一样的。

exec函数公式大全

exec函数公式大全

exec函数公式大全1.基本用法:```exec(code, globals=None, locals=None)```其中,code是包含待执行代码的字符串,globals是一个字典,表示全局命名空间,locals是一个字典,表示局部命名空间。

2.执行单行代码:可以使用exec(函数来执行单行代码,例如:```pythonexec('print("Hello, World!")')```这将在控制台上输出"Hello, World!"。

3.执行多行代码:可以使用exec(函数来执行多行代码,例如:```pythoncode = '''for i in range(5):print(i)'''exec(code)```这将输出数字0到44.动态生成代码:```pythonfor i in range(5):exec(f'x{i} = {i}')exec(f'print(x{i})')```这将输出数字0到4,并定义x0到x4这5个变量。

5.控制命名空间:可以使用globals和locals参数来控制代码执行的命名空间。

例如:```pythonglobals_dict = {'a': 1}exec('print(a)', globals_dict)```这将输出a的值16.导入模块:可以使用exec(函数来导入模块,并在代码中使用导入的模块。

例如:```pythonmodule_code = '''import mathprint(math.sqrt(25))'''exec(module_code)```这将输出5.0,表示对math模块进行开方计算。

7.安全性考虑:由于exec(函数执行的是字符串中的代码,因此需要谨慎使用以避免安全问题。

进程

进程

因等待事件发生而唤 醒
就绪
时间片到
运行
等待某个事件发生而阻塞
阻塞
图 6_1
进程管理
1. 启动进程
进程加载有两种途径:手工加载和调度加载 手工加载: 手工加载又分为前台加载,和后台加载。 前台加载:是手工加载一个进程最常用方式。一般地,当用户输入一个命令,如“ls -l” 时就已经产生了一个进程,并且是一个前台进程。 后台加载:往往是在该进程非常耗时,且用户也不急着需要结果的时候启动。常常用户 在终端输入一个命令时同时在命令尾加上一个“&”符号。 调度加载: 在系统中有时要进行比较费时而且占用资源的维护工作, 并且这些工作适合在深夜而无 人值守时运行,这时用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时系 统就会自动完成一切任务。 2. 调度进程
/*pidandppid.c*/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { printf(“PID = %d\n”, getpid()); printf(“PPID = %d\n”, getppid()); exit(0); } 通过编译后,运行程序得到以下结果(该值在不同的系统上会有不同的值) [root@localhost process]#./pidandppid
用系统的物理内存来容纳进程本身和它的有关数据、 要在文件系统中打开和使用文件、 并且 可能直接或间接的使用系统的物理设备,例如打印机、扫描仪等。由于这些系统资源是由所 有进程共享的, 所以操作系统必须监视进程和它所拥有的系统资源, 使它们可以公平地拥有 系统资源以得到运行。 小知识:假设有三道程序 A、B、C 在系统中运行。程序一旦运行起来,我们就称它为 进程,因此称它们为三个进程 Pa、Pb、Pc。假定进程 Pa 执行到一条输入语句,因为这时 要从外设读入数据,于是进程 Pa 主动放弃 CPU。此时操作系统中的调度程序就要选择一个 进程投入运行,假设选中 Pc,这就会发生进程切换,从 Pa 切换到 Pc。同理,在某个时刻 可能切换到进程 Pb。从某一时间段看,三个进程在同时执行,从某一时刻看,只有一个进 程在运行,我们把这几个进程的伪并行执行叫做进程的并发执行。

Turbo C 2.0 函数中文说明大全

Turbo C 2.0 函数中文说明大全

int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函数通过盘符drive(C:、A:等), 路径dir(\TC、\BC\LIB等), 文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名存与path中.
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中
double pow10(int p) 返回10p的值
double sqrt(double x) 返回x的开方
double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度
double atan(double x) 返回x的反正切tan-1(x)值,x为弧度
int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0
int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'), 返回非0值,否则返回0

linux系统编程之进程(五):exec系列函数(execl,execlp,execle,。。。

linux系统编程之进程(五):exec系列函数(execl,execlp,execle,。。。

linux系统编程之进程(五):exec系列函数(execl,execlp,execle,。

本节⽬标:exec替换进程映像exec关联函数组(execl、execlp、execle、execv、execvp)⼀,exec替换进程映像在进程的创建上Unix采⽤了⼀个独特的⽅法,它将进程创建与加载⼀个新进程映象分离。

这样的好处是有更多的余地对两种操作进⾏管理。

当我们创建了⼀个进程之后,通常将⼦进程替换成新的进程映象,这可以⽤exec系列的函数来进⾏。

当然,exec系列的函数也可以将当前进程替换掉。

例如:在shell命令⾏执⾏ps命令,实际上是shell进程调⽤fork复制⼀个新的⼦进程,在利⽤exec系统调⽤将新产⽣的⼦进程完全替换成ps进程。

⼆,exec系列函数(execl、execlp、execle、execv、execvp)包含头⽂件<unistd.h>功能:⽤exec函数可以把当前进程替换为⼀个新进程,且新进程与原进程有相同的PID。

exec名下是由多个关联函数组成的⼀个完整系列,头⽂件<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[]);参数:path参数表⽰你要启动程序的名称包括路径名arg参数表⽰启动程序所带的参数,⼀般第⼀个参数为要执⾏命令名,不是带路径且arg必须以NULL结束返回值:成功返回0,失败返回-1注:上述exec系列函数底层都是通过execve系统调⽤实现:#include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);DESCRIPTION:execve() executes the program pointed to by filename. filename must beeither a binary executable, or a script starting with a line of the form以上exec系列函数区别:1,带l 的exec函数:execl,execlp,execle,表⽰后边的参数以可变参数的形式给出且都以⼀个空指针结束。

《嵌入式系统开发(Linux)》实验9 exec函数族

《嵌入式系统开发(Linux)》实验9  exec函数族
参数说明
path:可执行文件的全路径,包含文件名本身。
arg:执行该文件的参数列表。参数列表中第一个参数就是该可执行文件的名称,最后要以(char*)0结束。
返回值
如果执行成功则函数不会返回,只有调用失败时会返回一个-1,失败原因存于errno中。
范例
#include<unistd.h>
main( )
6.问题
(1)程序中execl()、execv()、execlp()3个函数的运行结果是否是一样的?
(2) system()中必须是可执行的命令?可动手实验一下。
7.总结
Exec函数是指一组函数,它的作用是根据指定的文件名找到可执行的文件并且用它来取代调用进程的内容,exec函数一般需要在创建的子进程中执行,因为只有这样才能保证主程序不会在exec函数执行结束后就退出,包括代码段,数据段和堆栈。与exec函数族类似,有一个system()。此函数也能在一个程序中执行别的程序或命令。只是使用system()并不需要专门为其分配一个进程,不过system()在内部实现上还是会为它执行的程序分配子进程的。
返回值
=-1:出现错误
=0:调用成功但是没有出现子进程
>0:成功退出的子进程的id
如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成
main( )
{
char *exec_argv[4];
exec_argv[0]=”ls”;

exec族函数

exec族函数

科学就医健康生活
佚名
【期刊名称】《致富天地》
【年(卷),期】2015(000)007
【摘要】鼓励预约挂号,分时段、按流程就诊患者如确需去三级医院就诊,建议看病前先通过医院官方网站等正规渠道了解相关信息,对医院专业特色、科室分布等进行了解,根据自身情况有针对性地选择预约挂号。

【总页数】1页(P64-64)
【正文语种】中文
【中图分类】TP399
【相关文献】
1.北京市青少年"科学饮食,健康生活"科学调查体验活动启动 [J],
2.就医指南之六——肿瘤话说"药食同源"——传统理论,指导健康生活 [J], 贾立群
3.改善就医条件方便患者就医——中国中医科学院西苑医院改扩建工程奠基仪式隆重举行 [J], 文锦
4.科学就医健康生活 [J],
5.科学就医健康生活 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。

python中exec()用法

python中exec()用法

一、什么是exec()函数?执行函数(exec)是Python中的一个内置函数,它用于执行存储在字符串中的Python代码。

在执行过程中,exec()函数将字符串中的代码视为普通的Python代码来执行,从而使得我们可以动态地执行代码而不需要在代码中提前知道要执行的代码。

二、exec()函数的语法结构exec(source, globals=None, locals=None, /)参数说明:source:表示要执行的Python代码字符串。

这里需要注意的是,source参数可以是字符串、文件或者已被编译的代码对象。

globals:表示全局命名空间,如果省略了这个参数,那么exec()函数将在当前命名空间内执行代码。

locals:表示局部命名空间,如果省略了这个参数,那么exec()函数将在当前命名空间内执行代码。

三、exec()函数的用法1. 执行简单的Python代码exec('print("Hello, World!")')该代码将输出:Hello, World!2. 动态执行Python代码code_str = 'print("Hello, Dynamic World!")'exec(code_str)该代码也将输出:Hello, Dynamic World!3. 使用globals和locals参数执行代码globals_var = {'name': 'Alice'}locals_var = {}exec('print("Hello, " + name)', globals_var, locals_var)该代码将输出:Hello, Alice四、exec()函数的注意事项1. 安全性问题由于exec()函数可以执行任意的Python代码,所以在使用exec()函数的时候需要格外小心,避免执行不安全的代码。

exec的用法 -回复

exec的用法 -回复

exec的用法-回复什么是`exec`函数?在编程语言中,`exec`函数是一种在运行时执行其他代码的方法。

它通常用于动态创建、修改或执行程序的一部分,从而使编程更加灵活和可扩展。

`exec`函数的语法:`exec(code, globals=None, locals=None)`其中,- `code`参数是要执行的代码字符串。

- `globals`参数是一个用于存储全局变量的字典。

如果不提供此参数,则使用当前的全局字典。

- `locals`参数是一个用于存储局部变量的字典。

如果不提供此参数,则使用当前的局部字典。

需要注意的是,`exec`函数执行的代码字符串必须是有效的Python代码。

否则,将引发`SyntaxError`异常。

下面,让我们一步一步来了解`exec`函数的用法。

# 第一步:执行简单的表达式首先,我们可以使用`exec`函数来执行简单的表达式。

假设我们有一个表达式字符串`expression = "print(10 + 5)"`,我们可以使用`exec`函数来执行它:pythonexpression = "print(10 + 5)"exec(expression)执行以上代码,控制台将输出`15`。

# 第二步:执行代码块`exec`函数不仅可以执行简单的表达式,还可以执行代码块。

代码块是一个包含多行代码的字符串,在其中可以定义函数、循环等。

假设我们有一个代码块字符串`code_block = '''for i in range(5):print(i)'''`,我们可以使用`exec`函数来执行它:pythoncode_block = '''for i in range(5):print(i)'''exec(code_block)执行以上代码,控制台将输出:1234# 第三步:使用全局和局部变量`exec`函数还可以使用全局和局部变量。

exec函数族-Linux操作系统学习-老汉梦想家园

exec函数族-Linux操作系统学习-老汉梦想家园
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
/*命令参数列表,必须以NULL结尾*/
char *arg[]={"env",NULL};
char *envp[]={"PATH=/tmp","USER=sunq",NULL};
其语法为char *arg;字母为“v”(vertor)的表示将所有参数整体构造指针数组传递,其语法
为*const argv[]。读者可以观察execl、execle、execlp的语法与execv、execve、execvp的区别。
它们具体的用法在后面的实例讲解中会举例说明。
这里的参数实际上就是用户在使用这个可执行文件时所需的全部命令选项字符串(包括
头,否则将其视为文件名。
/*execl.c*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
if(fork()==0){
/*调用execl函数,注意这里要给出ps程序所在的完整路径*/
if(execl("/bin/ps","ps","-ef",NULL)<0)
第6位 e:可传递新进程环境变量execle、execve
p:可执行文件查找方式为文件名execl下面的第一个示例说明了如何使用文件名的方式来查找可执行文件,同时使用参数列表
的方式。这里用的函数是execlp。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

exec函数族简介exec函数族,顾名思义,就是一簇函数,他把当前进程映像替换成新的程序文件,而且该程序通常main函数开始执行!说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:#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 execve(const char *path, char *const argv[], char *const envp[]);其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。

exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。

这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件,如果不是可以执行的文件,那么就解释成为一个shell文件,sh **执行!深入上面6条函数看起来似乎很复杂,但实际上无论是作用还是用法都非常相似,只有很微小的差别。

参数argc指出了运行该程序时命令行参数的个数,数组argv存放了所有的命令行参数,数组envp存放了所有的环境变量。

环境变量指的是一组值,从用户登录后就一直存在,很多应用程序需要依靠它来确定系统的一些细节,我们最常见的环境变量是PATH,它指出了应到哪里去搜索应用程序,如 /bin;HOME也是比较常见的环境变量,它指出了我们在系统中的个人目录。

环境变量一般以字符串"XXX=xxx"的形式存在,XXX表示变量名,xxx表示变量的值。

值得一提的是,argv数组和envp数组存放的都是指向字符串的指针,这两个数组都以一个NULL元素表示数组的结尾。

现在来看一下exec函数族,先把注意力集中在execve上:int execve(const char *path, char *const argv[], char *const envp[]);execve第1个参数path是被执行应用程序的完整路径,第2个参数argv就是传给被执行应用程序的命令行参数,第3个参数envp是传给被执行应用程序的环境变量。

在这里有点要注意,不管是arg0,还是argv[0]都必须是程序的可执行文件的名字,比如:execl("/bin/echo", "echo", "executed by execl", NULL)中的echo;execl("/bin/ls", "ls", "/azuo", "-la", (char *)0 )中的ls;execlp("echo", "echo", "executed by execlp", NULL)中的echo;留心看一下这6个函数还可以发现,前3个函数都是以execl开头的,后3个都是以execv开头的,它们的区别在于,execv开头的函数是以"char *argv[]"这样的形式传递命令行参数,而execl开头的函数采用了我们更容易习惯的方式,把参数一个一个列出来,然后以一个NULL表示结束。

这里的NULL的作用和argv数组里的NULL作用是一样的。

这里建议使用 (char *)0 代替NULL。

在全部6个函数中,只有execle和execve使用了char *envp[]传递环境变量,其它的4个函数都没有这个参数,这并不意味着它们不传递环境变量,这4个函数将把默认的环境变量不做任何修改地传给被执行的应用程序。

而execle和execve会用指定的环境变量去替代默认的那些。

还有2个以p结尾的函数execlp和execvp,咋看起来,它们和execl与execv的差别很小,事实也确是如此,除execlp和 execvp之外的4个函数都要求,它们的第1个参数path 必须是一个完整的路径,如"/bin/ls";而execlp和execvp的第1个参数 file可以简单到仅仅是一个文件名,如 "ls",这两个函数可以自动到环境变量PATH制定的目录里去寻找。

实战程序一 /*a.c*/#include <unistd.h>#include <stdio.h>int main(void) {execl("/bin/ls", "ls", "/azuo", "-la", (char *)0 );}输出:[root@BTazuo ~]# ./a.out总计90028drwxr-xr-x 4 root root 4096 04-14 13:31 .drwxr-xr-x 27 root root 4096 2008-04-15 ..-rwxr-xr-x 1 root root 32091 04-13 20:12 1_13440512a.jpg-rwxr-xr-x 1 root root 35588346 03-27 20:49 2006德国世界杯主题曲-国外歌曲.rm-rwxr-xr-x 1 root root 55386857 04-13 21:32 AdobeReader_chs-7.0.0-2.i386.rpm-rwxr-xr-x 1 root root 361598 04-13 20:12 ceM3CgQxrMFZA.jpg-rwxr-xr-x 1 root root 174772 04-13 20:12 ceyekJhxKQCR.jpgdrwxr-xr-x 2 root root 4096 04-14 13:31 chm文档查看器-rwxr-xr-x 1 root root 62043 04-13 17:22 posix多线程编程.tar.zdrwxr-xr-x 39 root root 4096 04-13 17:23 unpv13e-rwxr-xr-x 1 root root 427480 04-13 17:22 unpv13e.tar.gz程序二 /* e.c *//* e.c */#include <unistd.h>main(){char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing", NULL};char *argv_execv[]={"echo", "excuted by execv", NULL};char *argv_execvp[]={"echo", "executed by execvp", NULL};char *argv_execve[]={"env", NULL};if(fork()==0)if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)perror("Err on execl");if(fork()==0)if(execlp("echo", "echo", "executed by execlp", NULL)<0)perror("Err on execlp");if(fork()==0)if(execle("/usr/bin/env", "env", NULL, envp)<0)perror("Err on execle");if(fork()==0)if(execv("/bin/echo", argv_execv)<0)perror("Err on execv");if(fork()==0)if(execvp("echo", argv_execvp)<0)perror("Err on execvp");if(fork()==0)if(execve("/usr/bin/env", argv_execve, envp)<0)perror("Err on execve");}程序里调用了2个Linux常用的系统命令,echo和env,echo会把后面跟的命令行参数原封不动的打印出来,env用来列出所有环境变量。

由于各个子进程执行的顺序无法控制,所以有可能出现一个比较混乱的输出--各子进程打印的结果交杂在一起,而不是严格按照程序中列出的次序。

编译并运行:[root@BTazuo ~]# gcc -o e e.c[root@BTazuo ~]# ./eexecuted by execlPATH=/tmpUSER=leiSTATUS=testingexcuted by execvexecuted by execvpPATH=/tmpUSER=leiSTATUS=testingexecuted by execlpexecle输出的结果跑到了execlp前面。

如果用到了exec函数族,一定记得要加错误判断语句。

因为与其他系统调用比起来,exec很容易受伤,被执行文件的位置,权限等很多因素都能导致该调用的失败。

最常见的错误是:1. 找不到文件或路径,此时errno被设置为ENOENT;2. 数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT;3. 没有对要执行文件的运行权限,此时errno被设置为EACCES。

相关文档
最新文档