gpt4 book ai didi

c - 在 C 中实现 shell

转载 作者:行者123 更新时间:2023-12-02 01:55:59 27 4
gpt4 key购买 nike

我正在尝试用 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);
}
}
}

我的第一个 child 处理 < txtFile 排序,然后它将其输出发送到管道。

最佳答案

在将命令行分解为离散的命令和/或重定向之前,不要启动任何进程。否则,如果命令行格式错误,您可能会导致问题。

例如,假设您有一个 destroy_files删除文件并可选择说明它删除了哪些文件,以及 fix_files修复它们。假设用户将这些命令串在一起,如 destroy_files -v | fix_files < > . shell 最好是说“嘿,这里有语法错误”而不运行任何东西……但是如果你在遇到定界符时运行命令,这对用户来说太糟糕了。你已经开始了破坏他们文件的过程。)

至于重定向,您不需要单独的进程来处理重定向。只需适本地设置 FD 0、1 和/或 2,操作系统就会处理字节混洗(根据需要进行阻塞或缓冲)。您所要做的就是等待进程结束。

关于c - 在 C 中实现 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com