2016-03-10 60 views
0

傢伙,我有以下的C代碼:爲什麼wait()的返回-1版本的Xcode 7.2.1(7C1002)

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <errno.h> 


int main (int argc, char *argv[]) 
{ 
    int exit; 
    pid_t tc_pid, ret_pid; 
    tc_pid = fork(); 
    if(tc_pid != 0){ 
     ret_pid = wait(&exit); 
     printf("parent process done, tc_pid = %d, ret_pid = %d, errno = %d\n", tc_pid, ret_pid, errno); 
     fflush(stdout); 
    } 
    printf("parent process done, tcpid = %d, my_pid = %d\n", tc_pid, getpid()); 
    fflush(stdout); 

    return 0; 
} 

在Xcode的輸出是:

parent process done, tcpid = 0, my_pid = 74377 
parent process done, tc_pid = 74377, ret_pid = -1, errno = 4 
parent process done, tcpid = 74377, my_pid = 74374 

這裏哪裏等待的()的返回值是-1(應爲74377,如果正確的),並且errno是-4

然而,當我使用終端(I使用的zsh)相同的代碼運行,輸出爲:

parent process done, tcpid = 0, my_pid = 74419 
parent process done, tc_pid = 74419, ret_pid = 74419, errno = 0 
parent process done, tcpid = 74419, my_pid = 74418 

這就是我想要的。有誰知道爲什麼會發生這種情況?多謝你們。

我的OSX是10.11.3,我的機器是2015年初的MBPR,xcode 7.2.1, gcc 4.2.1,Apple LLVM版本7.0.2(clang-700.1.81),目標:x86_64-apple-darwin15 .3.0,線程模型:POSIX

回答

0

errno.h,errno的4EINTR其中man page for wait says is

The call is interrupted by a caught signal or the signal does not have the SA_RESTART flag set.

你顯然正在使用的信號來獲得wait退出。也許你可能需要重新思考你最終在這裏做什麼,並且有沒有辦法在不使用wait的情況下做到這一點?

+0

嗨,Michael,謝謝你的回覆,我只想看看fork()是如何工作的以及wait()如何工作的。問題是在gcc輸出是正確的,而在xcode不是,爲什麼會發生這種情況,xcode發送一箇中斷信號來處理? – Nimal