2015-02-13 1 views
0

В Linux терминал, я могу ввестиКак передать оператор перенаправления '>' в качестве аргумента для execv?

echo hello! > /path/to/file 

Я думал, что я мог бы сделать то же самое с помощью execv: «Hello!»

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main(void){ 
    char *write_cmd[] = { "echo", "hello!", ">", "/path/to/file", NULL}; 
    if (fork() == 0){ 
     execv("/bin/echo", write_cmd); 
    } 
    else{ 
     sleep(1); 
    } 
    return 0; 
} 

Однако этот код не писать к файлу, что я и хочу. Есть ли другой способ сделать это с помощью execv и echo?

Edit: Я попытался с помощью dup2 в виде раствора, а также: #include #include #include

int main(void){ 
    char *write_cmd[] = { "echo", "hello!", NULL }; 
    if (fork() == 0){ 
     int tmpFd = open("/path/to/file", O_WRONLY); 
     dup2(tmpFd, 1); 
     execv("/bin/echo", write_cmd); 
     close(tmpFd); 
     exit(0); 
    } 
    else{ 
     sleep(1); 
    } 
    return 0; 
} 

Однако это не дает мне результат, я хочу тоже. Это пишет «привет!». к файлу, но он также перезаписывает все остальное, что уже записано в файле. Как я могу гарантировать, что «привет!» будет записано в END файла?

+0

Оболочка интерпретирует его как оператора перенаправления. Когда вы запускаете новую программу напрямую, вместо того чтобы просить оболочку делать это от вашего имени, вы можете вручную выполнить перенаправление. Посмотрите на 'dup2'. – Deduplicator

+0

Спасибо за ответ. Я пробовал использовать dup2. Однако проблема заключается в том, что я хочу иметь возможность всегда писать в END файла. Когда я использую dup2, я могу только перезаписать то, что уже записано в файл. – Jay

+0

Ваш эхо привет! >/path/to/file' перезаписывает файл. Если вы всегда хотите добавить, пожалуйста, обновите вопрос, чтобы это было ясно. Оболочка использует '>>' для добавления в файл. Если вы используете то, что я предложил, вы можете передать '>>', а не '>' в оболочку. –

ответ

1

Прежде всего, операторы перенаправления, такие как >, интерпретируются оболочкой и ничего не значат для execve(2) (или эхо, если на то пошло). Вместо этого вы можете попробовать использовать system(3), или вы можете настроить перенаправление самостоятельно, открыв выходной файл и установив стандарт в результирующий файловый дескриптор, используя dup2(2) (см. this question).

Во-вторых, write_cmd является массивом char*, но '>' (обратите внимание на одинарные кавычки) имеет тип int. Это фактически означает, что вы помещаете целое число в массив, который в противном случае содержит указатели на строки. Вероятно, вы хотели написать ">".

+0

[system (3)] (http://linux.die.net/man/3/system) был лучшим вариантом. Спасибо за вашу помощь! – Jay

2

Вы можете, но только косвенно.

Оператор перенаправления > интерпретируется оболочкой; /bin/echo не распознает его и рассматривает его как еще один аргумент для печати.

Если вы хотите, чтобы оболочка выполняла перенаправление, вам нужно вызвать /bin/sh и передать всю команду ему в качестве аргумента.

Непроверенные код следующим образом:

char *write_cmd[] = { "/bin/sh", "-c", "echo hello! > /path/to/file", NULL }; 
// ... 
execv("/bin/sh", write_cmd); 

Или, проще говоря, вы могли бы использовать system().