gpt4 book ai didi

c - 为什么管道写端接受一个字节,然后失败并出现错误 EBADF?

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:17 24 4
gpt4 key购买 nike

我的程序有问题,它正在使用 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 并将错误设置为 EBADF。

你知道那里发生了什么吗?提前致谢,内布里尔

最佳答案

您将在一次写入后关闭管道。据我了解,一旦关闭就无法取回。对该文件描述符的后续写入(我实际上在您的代码中的任何地方都看不到)将设置错误“错误文件”,因为管道不再存在。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com