2013-12-18 73 views
0

我滿足約DUP2和多線程一個很字符串問題,代碼是這樣的:約DUP2和多線程問題

pipe out, err; 
int forkpid = fork(); 

if (forkpid == 0) { 
    dup2(out.writeFd, STDOUT_FILENO); 
    dup2(err.writeFd, STDERR_FILENO); 
    printf("hello\n"); 
} 

do { 
    int res = poll(&fds, 2, 200); 
    if (res) { 
     for (int i = 0; i < 2; i++) { 
      bytes = read(fds[i].fd, buff, size); 
      if (fds[i].fd == out.readFd) 
       printf("out\n"); 
      if (fds[i].fd == err.readFd) 
       printf("err\n"); 
     } 
    } 
} while(....); 

我已經在單獨的項目測試的代碼,我可以看到「你好」從STD輸出,但一旦我把它放在一個大項目,「你好」是犯錯:(

輸出我使用xcode5.0和混合C++和Objective C的。這方面有任何想法? 感謝

+0

你可以把它解釋成一個[short,self-contained,correct,compileable example](http://sscce.org/),它可以證明你的問題? –

+0

@AdamRosenfield,原始代碼是一個巨大的項目,實際上我已經在一些Xcode項目中嘗試了這段代碼,它工作正常。哦...對,我只是試過這個: 寫(STDOUT_FILENO,「hello」,5); 它確實寫入標準輸出,這意味着某些東西已將printf輸出更改爲標準錯誤... – Jet

+0

這可能看起來像一個奇怪的問題,但有可能'err.writeFd'或'out.writeFd'最終爲0 ,由於某種原因1或2?你可以在你的代碼中使用一些調試語句來檢查它。 –

回答

0

我找到了原因,之前我用NSlogV實現了一個printf,忘了那個。 NSlogV默認似乎將信息輸出到標準錯誤。所以這是理由。 - Jet