「深入了解 Linux exec 输出」 (linux exec 输出)

深入了解 Linux exec 输出

在 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】shell脚本中的 exec 命令

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”

#############

linux的find -exec命令的问题

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命令的问题的信息别忘了在本站进行查找喔。


数据运维技术 » 「深入了解 Linux exec 输出」 (linux exec 输出)