2

我和我的朋友正在尝试编写一个 shell。我的问题是运行'cat'命令然后用^C退出STDIN会使我的程序在waitpid上出现段错误,所以退出我的程序......(我当然不想要什么!)

每个命令都运行良好,我没有任何其他问题......我只是在询问它以及如何解决这些(大)问题。

谢谢你们的帮助!请参阅我在下面执行命令的代码:

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);
}

我得到了答案,谢谢:)。

4

1 回答 1

0

我只需要抓住信号......我很愚蠢:)。

对于任何解释:我们正在创建一个 shell,并且我们正在使用 termcaps 进行行编辑。和之前,我们捕获了^C 以避免退出程序并重新打印提示。因此,当我们启动像 bc 或 cat 这样的可执行文件,它正在读取 STDIN 并按下 ^C 时,我们正在重新打印提示,但可执行文件没有退出(cat 是,但 bc 否)。因此,首先,我们在执行命令之前恢复 termcaps,并且存在上述问题:P。这是段错误,所以我们刚刚捕获了 SIGINT,恢复了我们的 termcaps,并重新打印了提示。它现在完美运行:)。

于 2014-03-26T20:54:02.633 回答