我有一个在C上复制shell命令的项目。其中一个命令是|需要使用管道制作。我的其他命令有效但我无法使(ls | sort)工作。它说 ls无法访问|:没有这样的文件或目录 ls无法访问sort:没有这样的文件或目录
我希望有人可以帮我弄清楚如何解决管道问题?它开始尝试使它,所以我不必为每个命令创建一个单独的管道,所以我通过for循环运行它。
执行大部分工作的功能。 Runsource和Rundest在管道中打开和传输信息。
void execute(char *cmdline)
{
int pid, async;
char *args[MAX_ARGS];
char *pargs[MAX_ARGS];
int i = 1;
int j;
int nargs = get_args(cmdline, args);
if (nargs <= 0)
return;
if (!strcmp(args[0], "quit") || !strcmp(args[0], "exit"))
{
exit(0);
}
int npargs = get_pipe(cmdline, pargs);
if (npargs > 1)
{
int pdes[2];
pipe(pdes);
for (j = 0; i < npargs; j++)
{
nargs = get_args(pargs[j], pargs);
runsource(pdes, j, pargs, npargs);
rundest(pdes, j + 1, pargs, npargs);
close(pdes[0]);
close(pdes[1]);
}
}
else
{
while (args[i] < args[nargs])
{
if (strcmp(args[i], ">"))
{
freopen(args[i + 1], "w", stdout);
args[i] = NULL;
}
if (strcmp(args[i], ">>"))
{
freopen(args[i + 1], "a", stdout);
args[i] = NULL;
}
if (strcmp(args[i], "<"))
{
freopen(args[i + 1], "r", stdin);
args[i] = NULL;
}
}
}
/* check if async call */
if (!strcmp(args[nargs - 1], "&"))
{
async = 1;
args[--nargs] = 0;
}
else
async = 0;
pid = fork();
if (pid == 0) /* child process */
{
execvp(args[0], args);
/* return only when exec fails */
perror("exec failed");
exit(-1);
}
else if (pid > 0) /* parent process */
{
if (!async)
waitpid(pid, NULL, 0);
else
printf("this is an async call\n");
}
else /* error occurred */
{
perror("fork failed");
exit(1);
}
}
int main(int argc, char *argv[])
{
char cmdline[BUFFSIZE];
for ( ; ; )
{
printf("COP4338$ ");
if (fgets(cmdline, BUFFSIZE, stdin) == NULL)
{
perror("fgets failed");
exit(1);
}
execute(cmdline);
}
return 0;
}
答案 0 :(得分:0)
我看到你有特殊的代码来处理&#34;&lt;&#34;和&#34;&gt;&#34;符号,但我没有在你的答案中看到处理&#34; |&#34;的任何代码,那么你甚至期望它如何工作?现在的问题是你正在通过&#34; |&#34;作为ls
的参数,实际上你应该在管道之后运行该事物作为将ls
的标准输出发送到该命令的标准输入的命令。
为什么要通过解析内容并手动设置管道来尝试从头开发shell?您不能仅使用system()
来执行shell命令吗?