C:在C中执行和输出shell命令

问题描述 投票:-1回答:1

除了使用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行的行为,以及之后如何执行命令?就像何时,执行命令或执行命令的原因一样?

c shell command output execute
1个回答
0
投票

在这之后

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

它将采取所有参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.