gpt4 book ai didi

c++ - 叉(): Dont return from child until it's terminated

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:29 27 4
gpt4 key购买 nike

我在使用 fork() 之类的东西时遇到了一些麻烦。

我正在开发一个 shell,用户可以在其中编写将像在普通普通 shell 中一样执行的命令。

我有一个像这样的主要功能:

void Shell::init() {
string command;
while (1) {
cout << getPrompt() << " ";
command = readCommand();
if (command.length() > 0) handleCommand(command);
}
}

handleCommand() 是一个几乎可以做所有事情的函数。在其中的某处,我有以下内容:

...
else {
pid_t pid;
pid = fork();

char* arg[tokens.size() + 1];
for (int i = 0; i < tokens.size(); ++i) {
arg[i] = (char*) tokens[i].c_str();
}
arg[tokens.size()] = NULL;

if (pid == 0) {
if (execvp(tokens[0].c_str(), arg) == -1) {
cout << "Command not known. " << endl;
};
} else {
wait();
}
}

我想要的是,当我到达那个点时,该命令将被视为程序调用,因此我创建了一个 child 来运行它。它的工作几乎完美,但我在程序输出之前再次收到提示。示例:

tronfi@orion:~/NetBeansProjects/Shell2$ whoami
tronfi@orion:~/NetBeansProjects/Shell2$ tronfi

tronfi@orion:~/NetBeansProjects/Shell2$

child 应该在 execvp 之后死去,所以它不应该调用提示,而 parent 正在等待直到 child 死去。

那么...我做错了什么?

谢谢!!

最佳答案

您错误地调用了 wait()。它期望传递一个指向 int 的指针,其中将存储 child 的退出状态:

int status;
wait(&status);

不过,实际上,您应该使用 waitpid() 来检查您要查找的特定子项。如果 waitpid() 被信号中断,你还需要循环:

int r;
do {
r = waitpid(pid, &status, 0);
} while (r < 0 && errno == EINTR);

关于c++ - 叉(): Dont return from child until it's terminated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402070/

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