除了使用popen()
(正如在这个question中讨论过),这是一个有效的方法吗?
假设我们有一个名为hexdump_dup的程序,并希望程序输出hexdump
命令的确切输出。
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd;
fd = open("hexdump_dup", O_CREAT | O_TRUNC | O_WRONLY, 0755); // (line 8)
write(fd, "/usr/bin/hexdump $@;", 20); // (line 9)
close(fd);
return (0);
}
也有人可以简单解释第8行和第9行的行为,以及之后如何执行命令?就像何时,执行命令或执行命令的原因一样?
在这之后
fd = open("hexdump_dup", O_CREAT | O_TRUNC | O_WRONLY, 0755); // (line 8)
write(fd, "/usr/bin/hexdump $@;", 20);
你需要执行hexdump_dup
可执行文件,因为你需要使用system()
或exec()
系列函数。例如
system("./hexdump_dup 1 2 3"); /* after creating binary file(hexdump_dup) & writing command into it, you need to run it, for that use system() or exec() */
这个
fd = open("hexdump_dup", O_CREAT | O_TRUNC | O_WRONLY, 0755);
将创建hexdump_dup
二进制文件,如果它之前和之前不存在,它将截断其内容到0
。你可以参考open()的手册页
int open(const char *pathname, int flags, mode_t mode);
参数标志必须包括以下访问模式之一:O_RDONLY,O_WRONLY或O_RDWR。这些请求分别打开文件只读,只写或读/写。
O_CREAT如果文件不存在,将创建它。文件的所有者(用户ID)设置为进程的有效用户ID。
O_TRUNC如果文件已经存在并且是常规文件且开放模式允许写入(即,是O_RDWR或O_WRONLY),则它将被截断为长度0.如果文件是FIFO或终端设备文件,则忽略O_TRUNC标志。
最后这个
write(fd, "/usr/bin/hexdump $@;", 20);
在这种情况下,将包含字符数组20
的/usr/bin/hexdump $@;
字节写入fd
指向的文件,即将其放入hexdump_dup
文件中。
这里$@
意味着你执行hexdump_dup
之类的
./hexdump_dup 1 2 3
它将采取所有参数传递。