「深入了解 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 文件中。如果没有重定向标准输出,则输出将打印到终端上。