我正在尝试编写shell。但我的shell没有执行命令 - 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;
}
答案 0 :(得分:9)
ls -l | less
实际上是一个shell命令行,由两个由管道连接的进程组成。 execvp()
调用只能生成一个进程。
如果要从程序中执行此操作,则必须显式调用shell - 使用system()
调用或将命令行更改为sh -c 'ls -l | less'
。您的word
数组应如下所示:
word[0] = "sh"
word[1] = "-c"
word[2] = "ls -l | less"
word[3] = NULL
[编辑]或者,您可以执行shell在内部执行的操作:生成两个进程并使用管道连接它们。这将涉及使用fork()
,pipe()
,dup2()
和execve()
来电。但是,调用shell的工作要少得多,而且less
无论如何都是一个交互式程序,你不必担心性能太多:任何小于100毫秒的东西都被认为是瞬时的。 / p>