我的程序有问题,它正在使用IPC消息队列。虽然IPC工作正常,但管道有问题,我还没能解决。这是我程序的子流程代码。它从文件中读取一个字节,然后将其写入管道。

char buf;
  int r;
  r = read(fileR, &buf, 1);
  if(r == 0){//file is empty
   cout<<"Empty"<<endl;
   lseek(fileR, 0, SEEK_SET);
   msgbuf.mtype = subProcessCount+1;
   msgbuf.mtext[0] = whichPid;
   sendAndCheck(queue, 3);
  }else{
   //cout<<whichPid<<" writing "<<buf<<" to pipe"<<endl;
   cout<<"Closing pipe[0]"<<endl;
   close(comPipe[0]);
   if(write(comPipe[1], &buf, 1) == -1){
    switch(errno){
     case EACCES: cout<<"EACCESS"; break;
     case EIDRM: cout<<"EIDRM"; break;
     case ENOENT: cout<<"ENOENT"; break;
     case ENOMEM: cout<<"ENOMEM"; break;
     case ENOSPC: cout<<"ENOSPC"; break;
     case EFAULT: cout<<"EFAULT"; break;
     case EINTR: cout<<"EINTR"; break;
     case EINVAL: cout<<"EINVAL"; break;
     case EPIPE: cout<<"EPIPE"; break;
     case EAGAIN: cout<<"EAGAIN"; break;
     case EBADF: cout<<"EBADF"; break;
     case EFBIG: cout<<"EFBIG"; break;
     case EIO: cout<<"EIO"; break;
     default: cout<<"writefail"<<endl; break;
    }
   }else{
    cout<<"written";
   }
   close(comPipe[1]);
   cout<<"Closing pipe[1]"<<endl;
  }

这是父进程的代码,当子进程完成时应该从该管道读取(然后将其写入fifo,但现在不重要了)。
 close(comPipe[1]);
 cout<<"Closing pipe[1]"<<endl;
 outfifo = open(pathBuf.mtext, O_WRONLY );
while(1){
r = read(comPipe[0], &buffer, BUF_SIZE);
cout<<"Buffer size: "<<r<<endl;
write(outfifo, &buffer, r);
if(r < BUF_SIZE){
  break;
 }
}
close(comPipe[0]);
cout<<"Closing pipe[0]"<<endl;
close(outfifo);

当我测试它时,第一个字节进入管道,但是下一个字节使write()返回-1并将error设置为EBADF。
你知道那里发生了什么吗?提前谢谢你,
尼布里尔

最佳答案

你写了一封信就要把管子关上了。据我所知,一旦关闭,就再也收不回来了。对该文件描述符的后续写入(我在代码中的任何地方都看不到)将设置错误“坏文件”,因为管道不再存在。

关于c - 为什么管道写端接受一个字节,然后又失败并出现错误EBADF?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4598685/

10-11 23:23
查看更多