gpt4 book ai didi

c++ - 我的代码中的一个奇怪的错误导致了一些奇怪的结果,我相信这是由于我使用了 fork

转载 作者:行者123 更新时间:2023-11-28 00:06:42 27 4
gpt4 key购买 nike

不同类型的输入会产生一些不同的奇怪结果。首先,我正在构建一个简单的 linux shell,下面我展示了一些示例 i/o

$ 
$
$
$ ls -l /
$ $ exit

所以您可能首先注意到的是双 $。每当我在提示中输入内容而不是简单地留空时,就会发生这种情况。其次,它似乎已经正确退出,因为它将控制权返回到我的终端......或者是吗?我真的不知道,但是当我在我的终端中时,如果我简单地按下回车键,我的终端中就会弹出这个消息。

finn-and-jake@CandyKingom:~/Desktop/OS/hw2$ terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at

我不是 100% 知道这是什么原因或如何解决它,但我有预感它与 fork 有关,我相信这也是导致我额外 $.当我像上面那样输入时还有另一个问题,但是在初始和退出之间有一些空输入,这导致程序没有完全关闭。下面提供了一个示例。

$ 
$
$ ls -l /
$ $
$
$
$
$
$
$
$ exit

$ exit

最后,还有一个问题,我不确定是什么原因导致程序在无限循环中运行,我无法强制退出,它使我的操作系统 (Ubuntu 14.04) 崩溃

为了尽量减少代码,我只包括了我怀疑是造成这种情况的方法。如果超出要求,我会将其包含在编辑中。

void Shell::interpreteInput() {
if (commandQueue.empty()) {
return;
};

if (commandQueue.at(0) == "exit") {
exit = true;
return;
};

pid_t pid = fork();
if (pid < 0) {
cerr << "Fork unsuccessful\n";
return;
};
if (commandQueue.size() >= 3 && commandQueue.at(commandQueue.size() - 2) == ">") {
//commandQueue.at(commandQueue.size() - 1) is fileName open


//commandQueue.at(0) is name of program to run exec
//remaining substrings are args
};

//commandQueue.at(0) is name of program to run exec
// remaining substrings are args

};

编辑(对评论中第一个问题的回应):在子进程中,执行给定的程序,将给定的参数(如果有)传递给它。如果程序是一个裸名(即,它不包含任何斜杠),则在 PATH 中搜索可执行文件。如果该行具有形式 1(我的第四个 if 语句)——输出将被重定向——打开(创建或覆盖)具有给定路径的文件,并将程序的输出重定向到该文件。 (请参阅下面的详细说明。)

• 如果要重定向输出但无法打开文件,则显示错误消息并返回步骤 1。

• 如果无法执行给定程序(exec 失败),则显示错误消息并返回到步骤 1。

最佳答案

fork() 之后,会检查 fork 错误,否则父进程和子进程之后都会做同样的事情。您可能想要分散代码路径:父对象做一件事,子对象做另一件事。

传统上,shell 父进程等待子进程完成,除非有 & 表示父进程不等待。然后 child 将命令管道和 exec 的命令一起挖出。

关于c++ - 我的代码中的一个奇怪的错误导致了一些奇怪的结果,我相信这是由于我使用了 fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301518/

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