linux exec的用法

linux exec的用法
说是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下可执行的脚本文件。

与一般情况不同,exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,颇有些神似"三十六计"中的"金蝉脱壳"。

看上去还是旧的躯壳,却已经注入了新的灵魂。

只有调用失败了,它们才会返回一个-1,从原程序的调用点接着往下执行。

现在我们应该明白了,Linux下是如何执行新程序的,每当有进程认为自己不能为系统和拥护做出任何贡献了,他就可以发挥最后一点余热,调用任何一个exec,让自己以新的面貌重生;或者,更普遍的情况是,如果一个进程想执行另一个程序,它就可以fork出一个新进程,然后调用任何一个exec,这样看起来就好像通过执行应用程序而产生了一个新进程一样。

事实上第二种情况被应用得如此普遍,以至于Linux专门为其作了优化,我们已经知道,fork 会将调用进程的所有内容原封不动的拷贝到新产生的子进程中去,这些拷贝的动作很消耗时间,而如果fork完之后我们马上就调用exec,这些辛辛苦苦拷贝来的东西又会被立刻抹掉,这看起来非常不划算,于是人们设计了一种"写时拷贝(copy-on-write)"技术,vfork结束后并不立刻复制父进程的内容,而是到了真正实用的时候才复制,这样如果下一条语句是exec,它就不会白白作无用功了,也就提高了效率。

返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

大家在平时的编程中,如果用到了exec函数族,一定记得要加错误判断语句。

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

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

l表示以参数列表的形式调用
v表示以参数数组的方式调用
e表示可传递环境变量
p表示PATH中搜索执行的文件,如果给出的不是绝对路径就会去PATH搜索相应名字的文件,如PATH没有设置,则会默认在/bin,/usr/bin下搜索。

另:调用时参数必须以NULL结束。

原进程打开的文件描述符是不会在exec中关闭的,除非用fcntl设置它们的“执行时关闭标志(close on exec)”而原进程打开的目录流都将在新进程中关闭。

例子:
#include <unistd.h>
int main(int argc, char *argv[])
{
char *envp[]={"PATH=/tmp", "USER=zhuzi", "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");
}
return 0;
}。

合集下载

linux -exec命令用法

linux -exec命令用法

在Linux中,`-exec`命令用于执行指定的命令,并可以将命令的输出作为当前shell的输出。

它通常与`find`命令结合使用,以在指定的目录中查找文件并执行相应的操作。

以下是`-exec`命令的用法:
```shell
find [路径] -exec [命令] {} \;
```
解释一下上述命令的各个部分:
* `find [路径]`:指定要查找的目录路径。

* `-exec [命令] {} \;`:`-exec`选项后面跟着要执行的命令,`{}`表示找到的每个文件名,最后的`;`表示命令的结束。

例如,如果要在当前目录及其子目录中查找所有扩展名为`.txt`的文件,并将它们复制到另一个目录中,可以使用以下命令:
```shell
find . -name "*.txt" -exec cp {} /path/to/destination \;
```
上述命令将查找当前目录及其子目录中所有扩展名为`.txt`的文件,并使用`cp`命令将它们复制到`/path/to/destination`目录中。

需要注意的是,`-exec`命令会为找到的每个文件执行指定的命令。

如果在执行过程中出现错误或需要中断操作,可以使用`Ctrl+C`来中断整个`find`命令的执行。

linux execstart 参数

linux execstart 参数

linux execstart 参数在Linux中,execstart是systemd服务单元文件(systemd unit file)中的一个参数,它指定了用于启动特定服务的命令。

本文将详细介绍execstart参数的使用方法、语法和附加选项,并提供一些示例。

execstart参数的语法如下:```ExecStart=/path/to/command [options]```该参数接受一个或多个命令,用于指定服务启动时要执行的命令。

当systemd启动服务时,它将执行这些命令并将其视为服务的一部分。

以下是一些常用的execstart参数选项和说明:1. WorkingDirectory:用于指定服务的工作目录。

可以使用绝对路径或相对路径。

例如:ExecStart=/path/to/commandWorkingDirectory=/path/to/directory```2. User:用于指定以哪个用户身份运行服务。

可以是用户名或用户ID。

例如:```ExecStart=/path/to/commandUser=username```3. Group:用于指定运行服务的用户组。

可以是组名或组ID。

例如:```ExecStart=/path/to/commandGroup=groupname4. Environment:用于指定服务运行时的环境变量。

可以一行一个或多行连续的方式指定多个变量。

例如:```ExecStart=/path/to/commandEnvironment=VAR1=value1Environment=VAR2=value2Environment=VAR3=value3```5. StandardOutput和StandardError:用于指定服务的标准输出和标准错误输出的重定向路径。

可以将输出重定向到一个文件或系统日志。

例如:```ExecStart=/path/to/commandStandardOutput=journal+consoleStandardError=journal+console```6. Restart:用于指定服务在失败或退出后是否重启。

在Linux终端中查找文件和文件夹

在Linux终端中查找文件和文件夹

在Linux终端中查找文件和文件夹在Linux操作系统中,终端是一个十分强大而且常用的工具。

通过终端,我们可以进行各种文件和文件夹的操作,包括查找。

本文将介绍在Linux终端中如何快速准确地查找文件和文件夹。

1. 使用find命令进行基本查找find命令是Linux终端中最常用的查找命令之一,它可以根据用户指定的条件来查找文件和文件夹。

下面是find命令的基本语法:find [路径] [表达式]其中,路径表示要查找的目录路径,表达式是用于指定查找条件的参数。

以下是一些常用的表达式:- -name:按照文件或文件夹名称进行查找。

例如,要查找名为"test.txt"的文件,可以使用以下命令:find /path/to/directory -name test.txt- -type:按照文件类型进行查找。

例如,要查找所有目录,可以使用以下命令:find /path/to/directory -type d- -mtime:按照文件的修改时间进行查找。

例如,要查找在过去7天内被修改过的所有文件,可以使用以下命令:find /path/to/directory -mtime -7以上只是find命令的一小部分功能,更多用法可以通过man find命令进行查看。

2. 使用locate命令进行快速查找locate命令是另一个常用的查找命令,它通过搜索系统的数据库来进行查找,因此速度比find命令快。

但是需要注意的是,locate命令需要在使用之前先更新数据库。

以下是locate命令的基本用法:- 更新数据库:sudo updatedb- 查找文件或文件夹:locate [关键词]例如,要查找名为"test.txt"的文件,可以使用以下命令:locate test.txt3. 使用grep命令进行内容查找除了按照名称进行查找之外,有时候我们也需要按照文件内容进行查找。

这时可以使用grep命令,它可以在文件中搜索指定的关键词,并返回包含该关键词的行。

linux -exec用法

linux -exec用法

linux -exec用法什么是Linux中的exec命令及其用法?在Linux操作系统中,exec是一个非常有用的命令。

它用于执行系统中的可执行文件,将进程的一部分或整个代码段替换为新的可执行文件内容。

exec命令可以让我们在一个进程中运行另一个可执行文件,并且可以传递参数。

exec命令有多种形式和用途。

最常用的形式是execvp(),它接受一个文件名和一个字符串数组作为参数。

在本文中,我们将详细讨论exec命令的各种用法,并给出一些实际的例子。

1. execvp()命令的基本用法execvp()命令的基本语法如下:int execvp(const char *file, char *const argv[]);其中,file是要执行的可执行文件的文件名,argv是一个字符串数组,用于传递给可执行文件的参数。

数组中的第一个元素通常是可执行文件的名称。

如果execvp()命令执行成功,它将替换当前进程的代码段,并在新的代码段中执行指定的可执行文件。

如果execvp()命令执行失败,它将返回-1,并且当前进程的状态将保持不变。

让我们来看一个简单的示例,演示execvp()命令的基本用法:#include <stdio.h>#include <unistd.h>int main() {char *cmd[] = {"ls", "-l", NULL};execvp(cmd[0], cmd);printf("execvp() failed\n");return 0;}在这个例子中,我们创建了一个字符串数组cmd,其中包含ls命令和-l 参数。

然后,我们调用execvp()命令来执行ls命令。

如果execvp()命令执行成功,它将打印出当前目录的内容。

否则,它将打印出"execvp() failed"。

linux sys_execve 用法

linux sys_execve 用法

linux sys_execve 用法sys_execve 是Linux 系统调用,用于在当前进程上下文中执行一个新程序。

这个系统调用实际上是由execve 库函数在用户空间提供的接口背后所调用的。

sys_execve 的原型如下:cint execve(const char *filename, char *const argv[], char *const envp[]);参数说明:filename:要执行的程序的路径名。

argv:一个字符串数组,其中每个字符串都是传递给新程序的命令行参数。

这个数组必须以一个空指针结束。

envp:一个字符串数组,其中每个字符串都定义了新程序的环境变量。

这个数组也必须以一个空指针结束。

如果你不关心环境变量,可以传递NULL。

返回值:如果成功,execve 不会返回,因为调用进程的映像已经被新程序替换。

如果出现错误,它会返回-1,并设置全局错误变量errno 以指示发生了什么错误。

注意:由于execve 替换当前进程的映像,所以它会丢失所有当前进程的内存内容(除了某些特定的内容,如打开的文件描述符)。

示例用法:c#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main() {char *argv[] = {"/bin/ls", "-l", NULL};char *envp[] = {NULL}; // 使用当前环境,或者你可以定义自己的环境变量if (execve("/bin/ls", argv, envp) == -1) {perror("execve"); // 打印出错误信息exit(EXIT_FAILURE);}// 如果execve 成功,以下代码不会被执行exit(EXIT_SUCCESS); // 这只是为了完整性而写的,实际上永远不会被执行到}在这个例子中,我们使用execve 来执行/bin/ls 命令并传递-l 参数给它。

linux每日命令(21):find命令之exec

linux每日命令(21):find命令之exec

linux每⽇命令(21):find命令之execfind是我们很常⽤的⼀个Linux命令,但是我们⼀般查找出来的并不仅仅是看看⽽已,还会有进⼀步的操作,这个时候exec的作⽤就显现出来了。

⼀. exec参数说明:-exec 参数后⾯跟的是command命令,它的终⽌是以;为结束标志的,所以这句命令后⾯的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前⾯加反斜杠。

{} 花括号代表前⾯find查找出来的⽂件名。

使⽤find时,只要把想要的操作写在⼀个⽂件⾥,就可以⽤exec来配合find查找,很⽅便的。

在有些操作系统中只允许-exec选项执⾏诸如l s或ls -l这样的命令。

⼤多数⽤户使⽤这⼀选项是为了查找旧⽂件并删除它们。

建议在真正执⾏rm命令删除⽂件之前,最好先⽤ls命令看⼀下,确认它们是所要删除的⽂件。

exec选项后⾯跟随着所要执⾏的命令或脚本,然后是⼀对⼉{ },⼀个空格和⼀个\,最后是⼀个分号。

为了使⽤exec选项,必须要同时使⽤print选项。

如果验证⼀下find命令,会发现该命令只输出从当前路径起的相对路径及⽂件名。

⼆. 使⽤⽰例1. 查找当前⽬录下的⽂件,并对查找结果执⾏ls -l 命令命令:find . -type f -exec ls -l {} \;输出:[root@localhost home]# ls1.log2.log3.c4.log test[root@localhost home]# find -type f./1.log./2.log./3.c[root@localhost home]# find -type f -exec ls -l {} \;-rw-r--r--. 1 root root 0 Nov 14 17:55 ./1.log-rw-r--r--. 1 root root 0 Nov 14 17:55 ./2.log-rwxrwxrwx. 1 root root 0 Nov 14 18:00 ./3.c2. 查找当前⽬录下,24⼩时内更改过的⽂件,并进⾏删除操作(慎⽤,删除没有提⽰)命令:find -type f -mtime -1 -exec rm {} \;输出:[root@localhost home]# lltotal 0-rw-r--r--. 1 root root 0 Nov 14 17:55 1.log-rw-r--r--. 1 root root 0 Nov 14 17:55 2.log-rwxrwxrwx. 1 root root 0 Nov 14 18:00 3.cdrwxr-xr-x. 2 root root 6 Nov 14 18:16 4.log-rw-r--r--. 1 root root 0 Nov 15 18:02 5.logdrwxr-xr-x. 2 root root 6 Nov 14 17:55 test[root@localhost home]# find -type f -mtime -1./5.log[root@localhost home]# find -type f -mtime -1 -exec rm {} \;[root@localhost home]# ls1.log2.log3.c4.log test说明:在shell中⽤任何⽅式删除⽂件之前,应当先查看相应的⽂件,⼀定要⼩⼼!当使⽤诸如mv或rm命令时,可以使⽤-exec选项的安全模式。

linux根据关键字提取内容的命令

linux根据关键字提取内容的命令在Linux中,可以使用一些命令来根据关键字提取内容。

下面将介绍一些常用的命令和它们的用法。

1. grep命令:grep命令用于在文件中搜索匹配指定模式的行,并将其输出。

它的基本语法如下:```grep [选项] 模式文件名```其中,选项可以是:- `-i`:忽略大小写- `-v`:反向匹配,输出不包含模式的行- `-r`:递归搜索子目录- `-l`:只输出包含模式的文件名例如,要在文件example.txt中搜索包含关键字"hello"的行,可以使用以下命令:```grep "hello" example.txt```2. awk命令:awk是一种处理文本文件的强大工具,可以根据指定的模式提取内容。

它的基本语法如下:```awk '/模式/ {操作}' 文件名```其中,模式可以是正则表达式,操作可以是打印行、计算、替例如,要在文件example.txt中提取包含关键字"hello"的行,可以使用以下命令:```awk '/hello/ {print}' example.txt```3. sed命令:sed是一种流编辑器,可以根据指定的规则对文本进行编辑和转换。

它的基本语法如下:```sed 's/模式/替换/g' 文件名```其中,模式可以是正则表达式,替换可以是字符串或其他操作。

例如,要将文件example.txt中的关键字"hello"替换为"world",可以使用以下命令:```sed 's/hello/world/g' example.txt```4. find命令:find命令用于在指定目录下搜索文件和目录,并执行指定的操作。

它的基本语法如下:```find 目录 -name 文件名 -exec 命令 {} \;```其中,目录是搜索的起始目录,文件名可以是通配符,命令是要执行的操作。

linux mount showexec参数 -回复

linux mount showexec参数-回复"linux mount showexec参数"详解——保持文件执行属性的关键引言:在Linux操作系统中,mount命令用于将文件系统挂载到指定的目录中。

showexec参数作为mount命令的选项之一,用于保持文件系统中的文件执行属性。

在本文中,我们将探讨showexec参数的作用、用法,并详细说明如何使用这个参数来保持文件的执行属性。

一、showexec参数的概述showexec参数是一个选项,用于mount命令。

它的作用是告诉系统将挂载的文件系统中的所有文件都视为可执行文件,实际上并没有修改文件的执行权限。

这意味着即使文件的执行权限被设置为禁止执行(如无执行权限),挂载后仍然可以执行这些文件。

二、showexec参数的用法要使用showexec参数,你需要在mount命令中将其设置为指定文件系统的选项之一。

下面是mount命令的基本语法:mount -o showexec /dev/[device] [mountpoint]在上述语法中,“-o”用于指定选项,“showexec”是一个选项,用于打开文件的执行权限。

在实际应用中,showexec参数通常与其他选项一起使用,例如rw(可读写)、noexec(禁止执行)等。

这些选项可以在一个mount命令中组合使用,以满足特定的需求。

例如,如果你想同时开启读写权限和执行权限,可以这样使用showexec参数:mount -o rw,showexec /dev/[device] [mountpoint]三、showexec参数的工作原理showexec参数实际上并不修改文件的执行权限,它只是告诉操作系统将挂载的文件系统中的所有文件都视为可执行文件。

当你使用showexec参数挂载文件系统后,系统会在执行文件时检查文件系统类型(如ext2、ext3、ext4等),并在内核处理执行请求时跳过执行权限检查。

linux exec语法

linux exec语法Linux exec语法指的是在Linux系统中使用exec命令执行其他程序的语法规则。

exec是Linux系统中的一个重要命令,它可以用来执行其他程序,并且在执行完毕后替换当前进程。

在本文中,将详细介绍exec命令的语法以及使用方法。

exec命令的基本语法如下:```exec [-cl] [-a name] [command [arguments]]```其中,-c参数表示执行指定的命令,并将当前进程替换为该命令;-l参数表示执行指定的命令,并将当前进程替换为一个登录shell;-a name参数用于指定执行的命令名称。

command表示要执行的命令,arguments表示命令的参数。

exec命令的使用方法有以下几种情况:1. 执行外部命令:可以直接使用exec命令执行外部的可执行文件。

例如,要执行一个名为"test"的可执行文件,可以使用以下命令:```exec ./test```2. 执行shell内置命令:可以使用exec命令执行shell的内置命令。

例如,要执行一个名为"echo"的内置命令,可以使用以下命令:```exec echo "Hello, World!"```3. 执行shell脚本:可以使用exec命令执行shell脚本。

例如,要执行一个名为"script.sh"的shell脚本,可以使用以下命令:```exec ./script.sh```4. 执行命令并传递参数:可以在exec命令后面添加参数,将参数传递给要执行的命令。

例如,要执行一个名为"test"的可执行文件,并传递两个参数"param1"和"param2",可以使用以下命令:```exec ./test param1 param2```需要注意的是,使用exec命令执行其他程序时,会替换当前进程,也就是说,原来的进程将会被新的程序完全取代。

execlp函数使用方法

execlp函数使用方法
execlp函数,可以理解为Execute Command in Linux/Posix,是exec函数组之一,用于在Linux/Posix系统中执行某一指令,一般会通过系统调用实现,旨在一次性替换当前进程(由当前的进程的环境变量,进程组号,父进程号,资源上限,信号和处理方式以及控制等影响),并在新环境e中运行指定函数。

具体参数意义和使用方法如下:
execlp(const char *file, const char *arg, ...);
参数说明:
file参数:指向欲执行指令的字符串
arg参数:指向第一个参数的指针,即向file执行的参数
可变参数:即在arg参数之后的数量可变的参数,每个参数都是空结尾的字符串,最后一个参数必须是NULL
返回值:若成功则不返回,若失败则返回-1
使用示例:
// 执行绝对路径的程序
execlp("/usr/local/program/foo", "foo", arg1, arg2, arg3, NULL);
// 执行系统路径下的程序
execlp("echo", "echo", "localhost", NULL);。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档