【发布时间】:2013-12-18 01:04:18
【问题描述】:
遇到一个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(....);
我在一个单独的项目中测试了代码,我可以看到“hello”是从 std 输出的,但是一旦我把它放在一个大项目中,“hello”是从 err 输出的:(
我正在使用 xcode5.0 并混合 c++ 和目标 c。有什么想法吗? 谢谢
【问题讨论】:
-
你能把它归结为一个 short, self-contained, correct, compileable example 来证明你的问题吗?
-
@AdamRosenfield,原始代码是一个巨大的项目,实际上我已经在一个非常多的 Xcode 项目中尝试过这段代码,它运行良好。哦...对,我刚试过这个: write(STDOUT_FILENO, "hello", 5);它确实写入标准输出,这意味着某些东西已将 printf 输出更改为标准错误...
-
这似乎是一个奇怪的问题,但
err.writeFd或out.writeFd是否有可能由于某种原因最终成为 0、1 或 2?您可以通过代码中的一些调试语句来检查这一点。 -
@JoeZ,我找到了原因。我之前用 NSlogV 实现了一个 printf,但我忘记了。 NSlogV 默认似乎将信息输出到标准错误。所以这就是原因。