【问题标题】:Questions about dup2 and multiple thread关于dup2和多线程的问题
【发布时间】: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.writeFdout.writeFd 是否有可能由于某种原因最终成为 0、1 或 2?您可以通过代码中的一些调试语句来检查这一点。
  • @JoeZ,我找到了原因。我之前用 NSlogV 实现了一个 printf,但我忘记了。 NSlogV 默认似乎将信息输出到标准错误。所以这就是原因。

标签: c++ c macos fork dup2


【解决方案1】:

我找到了原因。我之前用 NSlogV 实现了一个 printf,但我忘记了。 NSlogV 默认似乎将信息输出到标准错误。所以这就是原因。 – 喷气机

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2019-03-08
    • 2011-01-29
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多