【问题标题】:C: Executing and outputing shell commands in CC:在 C 中执行和输出 shell 命令
【发布时间】:2019-02-18 21:02:09
【问题描述】:

除了使用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 行的作用,以及之后如何执行命令?比如什么时候,在哪里执行命令或者是什么让命令执行?

【问题讨论】:

  • 我认为这是一个类似的问题stackoverflow.com/questions/5237482/…
  • 在第 8 行,使用的系统调用是int open(const char *pathname, int flags, mode_t mode); 第一个参数是要打开的文件名,第二个参数是一组标志。在您的情况下,您使用了O_CREAT O_TRUNC O_WRONLY。如果文件不存在,首先创建文件。 O_TRUNC - 如果文件已经存在并且是常规文件并且访问模式允许写入(即 O_RDWR 或 O_WRONLY),它将被截断为长度 0。如果文件是 FIFO 或终端设备文件,则忽略 O_TRUNC 标志.否则,未指定 O_TRUNC 的效果。
  • 这个位有什么作用write(fd, "/usr/bin/hexdump $@;", 20);。如果我不得不猜测;这将写入新创建的文件,系统的 hexdump 命令的二进制源代码......如果我错了,请纠正我。 $@ 是做什么的? @Gunasekar
  • @Lion 我不确定$@。数字 20 代表要写入的字节数。
  • write(fd, "/usr/bin/hexdump $@;", 20);"/usr/bin/hexdump $@;" 写入文件描述符fd 给定的文件,最多20 个字节。您可能已经注意到该字符串也有 20 个字符(不包括终止符 NULL)。字符串中的$@ 指的是传递给脚本的所有参数。有关更多信息,请参阅stackoverflow.com/questions/9994295/…

标签: c shell command output execute


【解决方案1】:

之后

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);

参数 flags 必须包含以下访问权限之一 模式: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); 

在这种情况下将包含字符数组/usr/bin/hexdump $@;20 字节写入fd 指向的文件中,即将其放入hexdump_dup 文件中。

这里$@的意思是当你执行hexdump_dup时喜欢

./hexdump_dup 1 2 3

它将接受所有要传递的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2014-03-06
    • 2013-03-12
    • 2013-01-01
    相关资源
    最近更新 更多