2014-03-26 31 views
2

我的朋友和我正在嘗試編寫一個外殼。 我的問題是,運行'貓'命令,然後用^ 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); 
} 

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

回答

0

我不得不趕上信號......我傻:)。

對於任何解釋: 我們正在創建一個外殼,而我們使用的termcap進行在線編輯。之前,我們抓住^ C來避免退出程序並重新打印提示。所以當我們啓動像bc或cat這樣的可執行文件時,誰在閱讀STDIN並且我們按^ C,我們正在重新打印提示符,但可執行文件沒有退出(cat yes,但bc no)。 首先,我們在執行命令之前恢復了termcaps,並且出現了上述問題:P。 這是segfaulting,所以我們剛剛發現了SIGINT,恢復了我們的termcap,並重新打印了提示。它現在完美:)。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – yizzlez

+0

請使用您問題上的編輯鏈接添加其他信息。後回答按鈕應該只用於問題的完整答案。 – Miller