write()打印输入到stdout而不是管道

时间:2014-01-20 17:01:47

标签: c pipe

我有关于write()和管道的问题 我把我的问题缩小到这两个代码片段,一个用于写入管道,一个用于检查是否发生了任何事情:

家长流程:

char* reply = malloc(sizeof(char) * 15);
addchar(reply);
if (shm->nextStone == -1) {
  sprintf(reply, "PLAY %s", shm->nextField);
} else {
  sprintf(reply, "PLAY %s,%d", shm->nextField, shm->nextStone);
}

err = write(fd[1], reply, 15);
(...)

子进程:

rc = select(biggest + 1, &fds, NULL, NULL, &timeout);
(...)
else if (FD_ISSET(pipe, &fds)) {
  doMove(sock, buffer, fd); //read is going to be called here
}

它在大多数情况下工作正常,但在程序运行一段时间后,write()表现得很奇怪:

它不是将输入写入管道(fd),而是将输入打印到控制台,如printf。

FD_ISSET返回false,因为没有任何内容写入管道并且我的程序超时。我简直无法弄清楚为什么并且没有找到关于write()随机打印的任何内容。有谁知道为什么这样做?提前谢谢!

编辑:我只是在子进程中分配fd [0]并且除了close和write之外不对fd [1]做任何事情。这可能是问题吗?这是我的合作伙伴在子进程中分配fd [0]的部分。我认为缓冲流也不是问题,它永远不会超越PLAY A3,2例如

    int waitforfds(int sock, char* buffer, sharedmem * shm, int fd[]) {
    int rc, size, status, biggest;
    int pipe = fd[0];
    fd_set fds;
    struct timeval timeout;

    if (pipe > sock) {
            biggest = pipe;
    } else {
            biggest = sock;
    }
     do {
           (...)
            FD_SET(sock, &fds);
            FD_SET(pipe, &fds);
           (...)
            rc = select(biggest + 1, &fds, NULL, NULL, &timeout);
            if (rc == -1) {
                    perror("Error, select failed! \n");
                    return EXIT_FAILURE;

            if (rc > 0) {

                    if (FD_ISSET(sock, &fds)) {
                           (...)
                            }


                    } else if (FD_ISSET(pipe, &fds)) {
                            doMove(sock, buffer, fd);

                    }

            } else if (rc == 0) {
                    perror("Select timed out!. \n");
            }
    }
    while (rc != 0);

     (...)

第二次编辑: 我想我已经弄清楚了我在主函数之上全局声明了fd,并且由于某种原因导致了未定义的行为。我真的不知道为什么但是在我改变之后,它似乎再次起作用。还要感谢Jonathan告诉我有关fd可能具有值0的信息。

   int fd[2];

   int main(int argc, char** argv) {

   int main(int argc, char** argv) {
   int fd[2];

0 个答案:

没有答案