我正在尝试用C语言实现一个shell。
我已经完成的部分:我有一个指向用户输入的所有命令的指针数组,例如:
然后,我每次找到“<”、“>”、“>>”或“|”时,就设置标志。然后,根据它们的使用方式,使用这些标志来重定向、间接引用、追加或管道这些命令。我的问题是,在处理类似以下命令时:
我应该每次发现 '<', '>', '>>' 或 '|' 就创建多个进程吗? 还是在处理完所有命令后再创建这些进程? 有人能指点我一下吗?
这是我目前的代码:
我的第一个孩子处理了sort < txtFile,然后将输出发送到一个管道。
我已经完成的部分:我有一个指向用户输入的所有命令的指针数组,例如:
args[0]: sort
args[1]: <
args[2]: txtFile
args[3]: |
args[4]: grep
args[5]: key
然后,我每次找到“<”、“>”、“>>”或“|”时,就设置标志。然后,根据它们的使用方式,使用这些标志来重定向、间接引用、追加或管道这些命令。我的问题是,在处理类似以下命令时:
SHELL$: sort < txtFile | grep key
我应该每次发现 '<', '>', '>>' 或 '|' 就创建多个进程吗? 还是在处理完所有命令后再创建这些进程? 有人能指点我一下吗?
这是我目前的代码:
else if(pid > 0)
{
/* parent process */
if(!async)
waitpid(pid, NULL, 0);
else
printf("this is an async call\n");
if(PIPE_FLAG)
{
pid2 = fork();
if( pid2 == 0)
{
waitpid(pid, NULL, 0);
close(c2p[1]);
if(dup2(c2p[0], STDIN_FILENO) == -1){
perror("dup2() failed");
exit(-1);
}
execvp(nxt_args[0], nxt_args);
perror("exec failed 2. ");
exit(-1);
}
else if( pid2 > 0)
{
close(c2p[0]);
close(c2p[1]);
}
else
{
/* error occurred */
perror("fork failed");
exit(1);
}
}
}
我的第一个孩子处理了sort < txtFile,然后将输出发送到一个管道。
cat | less
,然后使用ps -ef
自行查看。 - Maxime Chéramystdin
和stdout
(重定向和管道的写入部分)。然后,您再次将父进程分叉以创建第二个进程,并将stdin
更改为管道的读取部分。在子进程中执行sort
和grep
之前,通过设置标准I/O来执行exec。 - Maxime Chéramy