C: выполнение и вывод команд оболочки в C - PullRequest
0 голосов
/ 14 сентября 2018

Помимо использования popen() (как обсуждалось в этом вопросе ), это правильный способ сделать это?


Скажем, у нас есть программа с именем 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, и как после этого команда выполняется? Например, когда, где говорится выполнить команду или что заставляет ее выполнять?

1 Ответ

0 голосов
/ 14 сентября 2018

После этого

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 Если файл не существует, он будет создан . Владелец (идентификатор пользователя) файла установлен на действующий идентификатор пользователя процесса.

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

это займет все параметры, которые будут переданы.

...