深入了解 linux exec 输出
尼玛网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。
在 Linux 操作系统中,exec 是一个非常重要的函数,用于执行一个新进程时,替代当前进程映像。当一个进程调用 exec 函数时,它所在的用户空间的代码、数据和堆栈都会被替换成新进程的映像。这个新映像会从文件系统中加载到进程的内存空间中,并开始执行。
exec 函数的常见形式是 execl,该函数用于执行一个可执行文件并传递命令行参数。execl 的原型为:
“`
int execl(const char *path, const char *arg, /* (char *) NULL */ …);
“`
其中,path 是要执行的可执行文件的路径名,arg 是要传递给该程序的命令行参数,以 NULL 结尾。
在执行 execl 函数时,它会将指定的可执行文件加载到当前进程的内存空间中,并取代当前进程映像。这意味着,新的程序开始运行时,它将具有与当前进程相同的 PID、PPID 以及其他环境变量和打开的文件句柄。
除了 execl,其他常见的 exec 函数包括:
– execle:与 execl 相同,但允许明确指定环境变量。
– execlp:与 execl 相同,但允许在 PATH 环境变量中查找可执行文件。
– execv:与 execl 区别在于,它是用数组传递命令行参数的。
– execvp:与 execlp 区别在于,它是用数组传递命令行参数的。
需要注意的是,exec 函数的调用会直接取代当前进程的映像。因此,如果调用成功,它将永久地改变进程的行为,如果调用失败,则当前进程将继续运行。
exec 的输出
通过 exec 函数执行的新进程在启动时将继承当前进程的标准输入、输出和错误输出文件描述符。这意味着,新进程将使用当前进程打开的文件描述符进行输入和输出。
有时候,我们需要将执行新进程时的输出保存到文件中,以进行后续处理。这可以通过将标准输出重定向到一个文件来实现。重定向可以通过 dup2 函数来设置。
“`
int dup2(int oldfd, int newfd);
“`
该函数将 oldfd 所指向的文件描述符复制到 newfd 中。如果 newfd 已经打开,dup2 将关闭它并重复打开 oldfd 所描述的文件。
在执行 execl 函数之前,我们需要先将标准输出文件描述符重定向到文件中。示例如下:
“`c
#include
#include
#include
#include
#include
int mn()
{
int fd = open(“output.log”, O_WRON|O_CREAT|O_TRUNC, 0644);
if (fd
perror(“open”);
return -1;
}
if (dup2(fd, STDOUT_FILENO)
perror(“dup2”);
return -1;
}
close(fd);
execl(“/bin/ls”, “ls”, “-l”, (char *) NULL);
perror(“execl fled”);
return -1;
}
“`
该程序会将标准输出重定向到名为 output.log 的文件中,并以 ls -l 的方式执行 /bin/ls。执行完程序后,输出将被保存到 output.log 文件中。如果没有重定向标准输出,则输出将打印到终端上。
相关问题拓展阅读:
exec 是 bash 的内置命令
shell 的内件命令exec执行命令时,不启用新的shell进程。
source 和 . 不启用新的shell,在当前shell中执行,设定的局部变量在执行完命令后仍然有效。
bash 或 sh 或 shell script 执行时,另起一个子shell,其继承父shell的环境变量,其子shelll的变量执行完后不影响父shell。
exec是用被执行的命令行替换掉当前的shell进程,且exec命令后的其他命令将不再执行。
例如在当前shell中执行 exec ls 表示执行ls这条命令来替换当前的shell ,即为执行完后会退出当前shell。
为了避免这个结果的影响,一般将exec命令放到一个shell脚本中,用主脚本调用这个脚本,调用处可以用bash xx.sh(xx.sh为存放exec命令的脚本),这样会为xx.sh建立一个子shell去执行,当执行exec后该子脚本进程就被替换成相应的exec的命令。
其中有一个例外:当exec命令对文件描述符操作的时候,就不会替换shell,而是操作完成后还会继续执行后面的命令!
在shell脚本中使用exec命令,根据操作的对象不同会有不同的行为
文件描述符
shell中描述符一共有12个
0 代表标准输入
1 代表标准输出
2 错误输出
其他 3-9 都是空白描述符
# exec3>&1 4>&2 1>> bash.log 2>&1
其含义是: 复制标准输出到3 ,错误输出到 4 ,把 3 4 保存在bash.log 这个文件中。
# ./bash.sh >> bash.log 2>&1
其含义是:将bash.sh脚本执行的标准输出和错误输出追加重定向到 bash.log
如果exec 跟的是其他命令,则其他命令结束后,本shell也随之停止
# cat test_exec.sh
###################
#!/bin/bash
#
echo “Hello mysql”
exec echo “Hello oracle”
echo “Hello sqlserver”
####################
可以看到随着 echo ” hello oracle” 这条指令运行完本 整个脚本执行完毕,后面的 echo ” hello db2″ 没有执行!
Linux shell 脚本中, $@ 和$# 分别是什么意思?
$@ 表示所有脚本参数的内容
$# 表示返回所有脚本参数的个数
示例:编写如下shell脚本,保存为test.sh
###############
#!/bin/sh
echo “number:$#”
echo “argume:$@”
###############
执行脚本:
./test.sh first_arg second_arg
说明:给脚本提供了两个参数,所以$#输出的结果是2,$@代表了参数的内手册容!
怎么理解shell脚本中 exec “`dirname “$0″`/node””$0” “$@” ?
$# 脚本自己的路径
“`dirname “$0″`”/node # 脚本目录下的node程序的路径
$@# 脚本被执行时的命令行参数
合起来就是:用脚本目录下的node程序来解释这个脚本本身
exec scala “$0” “$@”是什么意思
这是bash语法。
$0 表示当前脚本的名字
$@ 表示当前脚本执没前行的所有参数
exec scala “$0” “$@” 表示用scala命令,带参数,执行当前脚本
exec sh “$0 在这个文件里,exec sh $0是什么意思?
############
#!/bin/sh
echo “Hello!”
sleep 2
execsh 毕察宏”$0″
#############
$0 是位置参数,表示脚本名称
$1 表示脚本的之一个参数,依次类推直到$9
exec用于执行命令、或脚本、或外部可执行程序,会新建一个shell去执行
综上,这里exec sh “$0” 就是执行脚本本身
所以,就是一个循环过程,每隔两秒打印一次 Hello
#############
#!/bin/sh
echo “Hello!”
sleep 2
exec “$0”
#############
find . -size +c -exec cp /dev/null {} \;
这茄信条指令毁纳瞎是将找纤空到的清除
find . -size +200M -exec /bin/cp /dev/null {} \;
试试truncate
find 宏尺源. -size +c -exec 困芦truncate {} –size 0 蔽态\;
linux exec 输出的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux exec 输出,「深入了解 Linux exec 输出」,【exec】shell脚本中的 exec 命令,linux的find -exec命令的问题的信息别忘了在本站进行查找喔。
香港服务器选创新互联,2H2G首月10元开通。
创新互联(www.cdcxhl.com)互联网服务提供商,拥有超过10年的服务器租用、服务器托管、云服务器、虚拟主机、网站系统开发经验。专业提供云主机、虚拟主机、域名注册、VPS主机、云服务器、香港云服务器、免备案服务器等。
当前名称:「深入了解Linuxexec输出」(linuxexec输出)
本文网址:http://www.gawzjz.com/qtweb2/news5/27005.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联