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
он будет принимать все параметры, которые будут переданы.