2011-01-04 1 views
1

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

답변

2

한 번만 작성하면 파이프가 닫힙니다. 내가 이해하면, 일단 닫히면 되돌릴 수 없다. 파이프가 더 이상 존재하지 않기 때문에 해당 파일 설명자에 대한 후속 쓰기 (코드에서 실제로 볼 수없는 부분)는 "잘못된 파일"오류를 설정합니다.

+0

새 파일에 해당 설명자 번호가 지정되면 잘못된 파일에 기록됩니다. 이로 인해 불쾌한 데이터 손상 문제가 발생할 수 있습니다. – jilles

0

의 문제가이 가능성이 높습니다. 대신, 시도 : 서버가 더 이상 outfifo에 쓸 수 없습니다 때 중단하고 종료합니다

written = write(outfifo, &buffer, r); 
if (written < r) { 

합니다.

0

코드가 1 바이트를 작성한 후 파이프를 닫는 것 같습니다. 나는 어떤 루핑도 보지 못했다.

독자가 조금 이상하게 보입니다.

+0

이 코드는 프로그램이 실행될 때 여러 번 호출됩니다. 미안하지만 지적해야합니다. – Nebril

0

필자는 절망적으로 시작했고 나는 임의의 일을했다. 하나 실제로 작동! 나는 모든 close(comPipe[1]); 전화를 던져 버렸고 지금은 살아있다! 도와 줘서 고마워. :). 그럼에도 불구하고 왜 그런 식으로 행동했는지는 모르지만 어쩌면 누군가에게 도움이 될 것입니다 ... 언젠가 : D

관련 문제