2016-09-30 5 views
1

Итак, что я пытаюсь сделать, это вызвать системную команду с функцией system(), а затем, независимо от ее вывода, я хотел бы ее перенести и отправить ее клиенту (сокет).Запустите системную команду с системой() и отправьте вывод

Клиент может отправлять различные сообщения. Это может быть ls, но это может быть даже qwerty. Я хотел бы взять вывод и поместить его в функцию write() в качестве аргумента const void* buffer. Я видел this topic, но я могу сделать это, чтобы работать. Пока я думал, что это может пойти куда-то из этих строк, но все, что я пробовал, не сработало.

/* buffer is message from the client: ls, ls -l, whatever*/ 
system(buffer) 
fp = popen(buffer, "r"); 
if(fp == NULL) 
    printf("Failed ot run command\n"); 

while(fgets(path, sizeof(path), fp) != NULL) { 
    //modify output here? 
} 
pclose(fp); 
write(socket_fd, output, strlen(buffer)); 
+0

Где вы вызываете 'систему()'? –

+0

@ Code-Apprentice прямо над – Lisek

+0

Не похоже, что команда из командной строки также будет именем файла. –

ответ

2

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

Переменная path в вопросе, который вы указали, кажется неправильным. Он содержит вывод системного вызова. Вы можете переименовать его для вывода, если хотите.

write() принимает длину буфера, который вы его отправляете. В этом случае это будет длина output, а не длина buffer.

Сведя все это вместе дает следующее:

char output[1035]; 
fp = popen(buffer, "r"); 
if(fp == NULL) 
    printf("Failed ot run command\n"); 

while(fgets(output, sizeof(output), fp) != NULL) { 
    write(socket_fd, output, strlen(output)); 
} 
pclose(fp); 
Смежные вопросы