段错误的猫/ waitpid函数(execve的在C)
问题描述:
我的朋友和我正在尝试编写一个外壳。 我的问题是,运行'猫'命令,然后用^ C退出STDIN使我的程序segfault on waitpid,所以退出我的程序...(我不想要的当然!)段错误的猫/ waitpid函数(execve的在C)
每个命令工作完美,我也没有任何其他问题......我只是问及如何解决这些(大)问题。
谢谢你的帮助! 见我的代码为略低于执行命令:
static int cmd_executeit(char **env, t_shell *shell, char *path)
{
pid_t forked;
int ret;
ret = 0;
if ((forked = fork()) == FAILURE)
return (bi_error(shell, "I can't fork with you :("));
if (forked == SUCCESS)
{
if (execve(path, shell->cmd, env) == FAILURE)
return (bi_error(shell, "Execution of the command failed"));
}
else
{
if (waitpid(forked, &ret, 0) < 0)
return (bi_error(shell, "I can't wait for this command. Sorry."));
}
if (WIFEXITED(ret) && (WEXITSTATUS(ret) == SUCCESS))
return (SUCCESS);
return (FAILURE);
}
我得到了答案,谢谢:)。
答
我不得不赶上信号......我傻:)。
对于任何解释: 我们正在创建一个外壳,而我们使用的termcap进行在线编辑。之前,我们抓住^ C来避免退出程序并重新打印提示。所以当我们启动像bc或cat这样的可执行文件时,谁在阅读STDIN并且我们按^ C,我们正在重新打印提示符,但可执行文件没有退出(cat yes,但bc no)。 首先,我们在执行命令之前恢复了termcaps,并且出现了上述问题:P。 这是segfaulting,所以我们刚刚发现了SIGINT,恢复了我们的termcap,并重新打印了提示。它现在完美:)。
这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://*.com/help/whats-reputation),你会能够[评论任何帖子](http://*.com/help/privileges/comment)。 – yizzlez
请使用您问题上的编辑链接添加其他信息。后回答按钮应该只用于问题的完整答案。 – Miller