我有关于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];