段错误的猫/ 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,并重新打印了提示。它现在完美:)。

+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://*.com/help/whats-reputation),你会能够[评论任何帖子](http://*.com/help/privileges/comment)。 – yizzlez

+0

请使用您问题上的编辑链接添加其他信息。后回答按钮应该只用于问题的完整答案。 – Miller