C: выполнение и вывод команд оболочки в C

Помимо использования 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 ответ

После этого

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

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

он будет принимать все параметры, которые будут переданы.

Другие вопросы по тегам