我试图在 C 中实现一个 shell。
到目前为止我做了什么:我有一个指针数组指向用户输入的所有命令,例如:
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,然后将其输出发送到管道。