2017-02-14 7 views
0

У меня возникли проблемы с получением execl для работы.Проблема с выполнением execl() для работы

pid_t pid = fork(); 

if(pid<0) { 
perror("fork error\n"); 

} else if(pid== 0){ 
execl("/home/"user name"/opSys", "ps", ">>", "test.txt", (char*)NULL); 

} else { 

int returnStatus; 
waitpid(pid, &returnStatus, 0); 

} 

Я пытаюсь заставить его запустить команду, а затем вывести ее в текстовый файл, однако ничего не происходит. Я искал поисковые запросы и пытался найти то, что нашел, например, разные exec. Я пробовал execlp(), я попытался просто заставить его использовать ps ant, а не помещать его в файл.

Я извиняюсь, если на это был дан ответ, который, я уверен, он имеет, однако я не могу найти решение, которое работает для меня. Спасибо заранее.

+1

Объясните мне это '«/ дома /»имя пользователя«/ OPSYS»'. –

+0

Был ошибкой в ​​сообщении, я исправил его. – lostknight

+3

'>>' - оператор оболочки. 'execl' этого не понимает. Он передаст '>>' программе 'opSys', а не оболочке. Это не то, что вы хотите. – kaylum

ответ

1

Я предполагаю, что >> в вашей команде должен создать перенаправление вывода. Это, однако, здесь не так. При задании в командной строке оператор >> интерпретируется оболочкой ; команда получает только аргументы и исключает их. Затем оболочка заботится о том, чтобы дескрипторы файлов были искажены должным образом для перенаправления.

В вашем случае команда получит три аргумента, а именно данные строки ps, >> и test.txt. Это как печатая

command ps '>>' test.txt 

команда, которую вы вызываете, вероятно, не сделать очень много, то, может быть выдано сообщение об ошибке на STDERR о плохих аргументов он получил (которые вы, вероятно, пропустили).

Я предлагаю вам попробовать вызвать оболочку, чтобы помочь вам интерпретировать вашу команду и передать вашу команду в виде строки:

execl("/bin/sh", "-c", "/home/"user name"/opSys ps >> test.txt", 
    (char*)NULL); 
+0

Btw, я надеюсь, что ваши 'user' и' name' - это некоторые макросы, оценивающие строки без пробелов, иначе это еще одна проблема, и вам нужно будет поместить одиночные кавычки по пути, чтобы избежать пробелов: '' '/ home/" имя пользователя "/ opSys 'ps >> test.txt". – Alfe

+0

Спасибо, Альф, это решило мою проблему. Мне пришлось выполнить execl ("/ bin/sh", "sh" ....); сначала, но моя проблема исправлена. – lostknight