IPC 메시지 대기열을 사용하는 프로그램에 문제가 있습니다. IPC가 제대로 작동하지만 아직 해결할 수 없었던 파이프에 문제가 있습니다. 이것은 내 프로그램의 하위 프로세스 코드입니다. 파일에서 1 바이트를 읽은 다음 파이프에 기록합니다.왜 파이프 쓰기 끝이 1 바이트를 받아들이고 그 후에 오류 EBADF로 실패합니까?
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)에 기록하지만, 지금은 중요하지 않습니다). I는 테스트시
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);
는 첫번째 바이트는 파이프로 진입하지만, 모든 다음 바이트 EBADF 쓰기()를 호출 -1 설정 에러를 만든다.
거기에 무슨 일이 일어나고 있는지에 대한 단서가 있습니까? 당신은 때 r < BUF_SIZE
루프를 종료하는
r = read(comPipe[0], &buffer, BUF_SIZE);
cout<<"Buffer size: "<<r<<endl;
write(outfifo, &buffer, r);
if(r < BUF_SIZE){
,하지만 당신은 한 바이트, r == 1
을 읽은 후 : 미리 감사드립니다, Nebril
새 파일에 해당 설명자 번호가 지정되면 잘못된 파일에 기록됩니다. 이로 인해 불쾌한 데이터 손상 문제가 발생할 수 있습니다. – jilles