Я пытаюсь закодировать оболочку. Но моя оболочка не выполняет команду -ls -l | меньше. Я использую execvp. код приведен ниже.
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
int pid, status, num, len;
char str[1000], cwd[100];
char* word[100];
getcwd(cwd, sizeof(cwd));
while(1){
chdir(cwd);
printf("%s > ", cwd);
gets(str);
pid=vfork();
if(pid == 0){
num = 0;
word[num] = strtok (str, " ");
while (word[num] != NULL) {
word[num] = strdup (word[num]);
len = strlen (word[num]);
if (strlen (word[num]) > 0)
if (word[num][len-1] == '\n')
word[num][len-1] = '\0';
word[++num] = strtok (NULL, " ");
}
if(strcmp(word[0], "cd") == 0){
chdir(word[1]);
getcwd(cwd, sizeof(cwd));
}
else{
execvp(word[0],word);
}
exit(0);
}
else{
wait(&status);
}
}
return 0;
}
|
— это токен, связанный с оболочкой. Выполнение этого вне оболочки на самом деле не работает, потому что это оболочка, которая читает|
и делает волшебство. Без оболочки, чтобы сделать волшебную трубку... это не работает. - person Cornstalks   schedule 04.09.2013execvp
написан для выполнения одной команды с набором параметров (если нужно). Вы можете попробоватьsystem
вызвать полноценную командную строку оболочки. - person lurker   schedule 04.09.2013vfork()
, прочитайте, что вам разрешено делать в дочернем процессе. Я не думаю, чтоchdir()
илиgetpwd()
разрешены. Вместо этого используйтеfork()
. Вероятно, это не главная ваша проблема (пока), но будьте очень, очень осторожны с ограничениями наvfork()
. - person Jonathan Leffler   schedule 04.09.2013ps aux | grep firefox | tee processes.txt
. - person Jonathan Leffler   schedule 04.09.2013sash
илиbash
, и прочтите Продвинутое программирование в Linux. - person Basile Starynkevitch   schedule 04.09.2013