UNIX shell C 管道的执行
我的程序应该从终端获取输入并执行命令 例如:“ls”或“ls -l | wc”
{...}
//Split the command and store each string in parameter[]
parameter[0] = malloc(255); //Allocate some space to the first element in the array
cp = strtok(command, " "); //Get the initial string (the command)
strncpy(parameter[0], cp, 50);
for(i = 1; i < MAX_ARG; i++)
{
parameter[i] = malloc(255);
cp = strtok(NULL, " "); //Check for each string in the array
parameter[i] = cp; //Store the result string in an indexed off array
if(strcmp(parameter[i], "|") == 0)
{
i = MAX_ARG;
cp = strtok(NULL, " ");
parameter2[0] = malloc(255);
strncpy(parameter2[0], cp, 50);
break;
}
if(parameter[i] == NULL)
{
break;
}
}
//Find the second set of commands and parameter
//strncpy(parameter2[0], cp, 50);
for (j = 1; j < MAX_ARG; j++)
{
parameter2[j] = malloc(255);
cp = strtok(NULL, " ");
parameter2[j] = cp;
}
{...} //这是命令和参数部分的执行:
if (proc1 == 0)
{
close(fd[0]); //process1 doenst need to read from pipe
close(STD_INPUT); //prepare for output
dup(fd[1]); //Standard output = fd[1]
close(fd[1]);
execvp(parameter[0], parameter); //Execute the process
}
else {
if (proc2 == 0)
{
close(fd[1]);
close(STD_OUTPUT);
dup(fd[0]);
close(fd[0]);
execvp(parameter2[0], parameter2);
}
//Parent process
else
{
waitpid(-1, &status, 0); //Wait for the child to be done
}
}
我不确定我做错了什么,因为当我输入“ls -l | wc”时wc”我收到一条消息“| 在目录中找不到”
My program is supposed to take input from the terminal and execute the command
for example: "ls" or "ls -l | wc"
{...}
//Split the command and store each string in parameter[]
parameter[0] = malloc(255); //Allocate some space to the first element in the array
cp = strtok(command, " "); //Get the initial string (the command)
strncpy(parameter[0], cp, 50);
for(i = 1; i < MAX_ARG; i++)
{
parameter[i] = malloc(255);
cp = strtok(NULL, " "); //Check for each string in the array
parameter[i] = cp; //Store the result string in an indexed off array
if(strcmp(parameter[i], "|") == 0)
{
i = MAX_ARG;
cp = strtok(NULL, " ");
parameter2[0] = malloc(255);
strncpy(parameter2[0], cp, 50);
break;
}
if(parameter[i] == NULL)
{
break;
}
}
//Find the second set of commands and parameter
//strncpy(parameter2[0], cp, 50);
for (j = 1; j < MAX_ARG; j++)
{
parameter2[j] = malloc(255);
cp = strtok(NULL, " ");
parameter2[j] = cp;
}
{...} //This is the execution of the command and parameter part:
if (proc1 == 0)
{
close(fd[0]); //process1 doenst need to read from pipe
close(STD_INPUT); //prepare for output
dup(fd[1]); //Standard output = fd[1]
close(fd[1]);
execvp(parameter[0], parameter); //Execute the process
}
else {
if (proc2 == 0)
{
close(fd[1]);
close(STD_OUTPUT);
dup(fd[0]);
close(fd[0]);
execvp(parameter2[0], parameter2);
}
//Parent process
else
{
waitpid(-1, &status, 0); //Wait for the child to be done
}
}
I am not sure what I am doing incorrectly because when I enter "ls -l | wc" I get a message saying " | not found in directory"
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以直接使用 execvp 执行 ls 和 wc,但
|
是 shell 程序的一个功能。所以你真正需要做的是运行 bash,然后将你的命令作为参数传递。虽然这很简单,但看起来你真正应该做的是自己实现 shell。为此,您需要进行一些解析,而不仅仅是使用 strtok 进行简单的标记化。如果这是一项作业,我希望他们能为您提供有关如何执行此操作的明确说明,或者至少您需要能够接受哪些类型的 shell 命令(只是管道?也许是子 shell?)。如果您只是想自己实现这一点,我会首先阅读一些编译器工具,例如 lex 和 yacc 可以帮助你解析 shell 命令并执行它们。
You can execute ls and wc directly with execvp, but the
|
is a feature of your shell program. So what you really need to do is run bash, and then pass as a parameter your commandThis is so trivial though, it seems like what you're really supposed to be doing is implementing the shell yourself. For that, you'll need to do some parsing, not just naive tokenizing with strtok. If this is an assignment, I would hope they would give you clear instructions on how to do that, or at least what kinds of shell commands you need to be able to accept (just pipes? subshells maybe?). If you're just trying to implement this on your own, I would start with reading up a bit on compiler tools like lex and yacc that can help you parse shell commands and execute them.