2015-10-26 4 views
1

У меня проблема с сохранением вывода execvp. Я хочу сохранить вывод (ps -eo pid, fname, state, ppid, gid, sid) в txt-файле.Как сохранить вывод execvp

Это мой код:

#include <unistd.h> 

int main(void) 
{ 
    char* args[]={"ps","-eo","pid,fname,state,ppid,gid,sid" , ">" , "t.txt"}; 
    execvp(args[0],args); 

    return 0; 
} 

Но когда я запускаю его .Это не работает.

+1

* Fork * новый процесс и * труба * для передачи вывода из стандартного вывода в родительский процесс. Есть тысячи примеров этого во всем Интернете, если вы просто ищете немного. –

+1

Кстати, массив аргументов не завершен, вызов 'execvp' приведет к неопределенному поведению, когда он выходит за пределы конца массива, чтобы найти терминатор. –

+1

Возможно, рассмотрите использование [popen (3)] (http://man7.org/linux/man-pages/man3/popen.3.html) или напрямую используйте [proc (5)] (http://man7.org /linux/man-pages/man5/proc.5.html) –

ответ

2

Так как вы уничтожить ваш процесс прямого вызова execvp, вы могли бы просто перенаправить вывод в файл:

int main() 
{ 
    char * args[] = {"ps","-eo","pid,fname,state,ppid,gid,sid", 0}; 
    int fd = open("t.txt", O_CREAT | O_TRUNC | O_RDWR, 0644); 
    if (fd < 0) { 
     perror("open()"); 
     exit(EXIT_FAILURE); 
    } 
    close(STDOUT_FILENO); 

    dup2(fd, STDOUT_FILENO); 

    execvp(args[0], args); 

    return 0; 
} 
0

«>» (поток Перенаправление) поддерживается оболочкой, так что здесь вы на самом деле нужно запустить оболочку с аргументами ps.

Popen - это всего лишь способ перенаправить поток более контролируемым образом.

Смежные вопросы