2009-06-07 5 views
0

스트림을 사용하여 관련없는 프로세스간에 파일 설명자를 전달하는 코드를 작성했습니다. 서버는 클라이언트가 파일 설명자를 보내기를 기다려야합니다. 다음은 서버 코드 :ioctl()이 블로킹되지 않는 이유는 무엇입니까?

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stropts.h> 
#include <stdio.h> 
#include <errno.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
    int fd; 
    int pipefd[2]; 
    pipe(pipefd); 
    close(pipefd[1]); 
    recvfd(pipefd[0]); 
    return 0; 
} 

void recvfd(int p) 
{ 
    struct strrecvfd rfdbuf; 
    struct stat statbuf; 
    int i; 
    i=ioctl(p, I_RECVFD, &rfdbuf); 
    printf("errno=%d\n",errno); 
    printf("recvfd=%d\n", rfdbuf.fd); 
} 

하지만 오류 번호 9받을 - 나쁜 파일 기술자를.

+0

사용중인 운영 체제는 무엇입니까? OS를 모르면 OS 호출에 대한 질문에 대답하기가 어렵습니다. – Dipstick

+0

왜 그것이 오류를 반환한다고 생각합니까? 이 코드는 ioctl 반환 값을 확인하지 않습니다. -1이 아니면 errno는 변경되지 않고 이전 시스템 호출 (예 : 동적 로더 또는 시작 루틴)의 값을 가질 수 있습니다. – mark4o

답변

2

실행중인 OS에 대해 언급하지 않았습니다. I_RECVFD는 일반적으로 System V 기반 Unixy 운영 체제 (예 : AIX 및 Solaris)에만 존재하는 STREAMS 확장의 일부입니다. Linux 나 BSD와 같은 다른 사람들은 Posix가 sendmsg()와 recvmsg()를 사용하는 대안을 가지고 있기 때문에 그것을 지원하지 않을 것이며 절대 포기하지 않을 것입니다.

Linux가 # I_RECVFD를 지원하지 않는 이유는 무엇인지 모르겠다.

+0

필자는 fifo (파이프가 아닌)와 ioctl()을 사용해야했고, 말한 것처럼 Linux에서는 작동하지 않지만 Solaris에서는 작동합니다. – Anonymous

0

실제 코드입니까? 왜냐하면 유효한 filedescriptor를 만들거나받지 못합니다.

2

주의 :이 질문에 대한 답변은 작성된 이후로 광범위하게 수정되었습니다.


시작하는 부분?

  • main()int을 반환합니다.
  • pipefd이 초기화되지 않았습니다.
  • 임의의 파일 설명자를 닫습니다.
  • recvfd()을 다른 임의의 파일 설명자로 호출합니다.
  • main()에서 값을 반환하지 않습니다.
  • #define 값을 사용하지 마십시오.
  • 이 컴파일에 필요한 파일 수는 #include입니다.
  • 사용하지 않은 변수 fd.
  • 사용하지 않은 변수 statbuf.
  • 선택하지 않은 반환 값 i.

기본 문제 - 초기화되지 않은 변수 사용.

보조 문제 - 제한된 오류 검사.


추가 문제 : 개념적으로 파일 설명자를 전달할 수있는 서버가 필요합니다. 다른 (관련이없는) 프로세스가 작성할 수있는 파일 설명자에서 서버를 읽어야합니다. 매뉴얼을 신중하게 검토 할 필요가 있지만 아마도 Unix 도메인 소켓에서 청취하거나 아마도 (명명 된) FIFO를 읽는 서버가 필요할 것입니다. 다른 프로그램은 소켓이나 FIFO를 열고 자신의 파일 디스크립터를 서버에 보낼 수 있습니다.

+0

기술적으로 main() (main _only_의 경우)에서 반환 유형을 생략해도 괜찮습니다.이 경우 int가 사용되는 것으로 가정합니다. 마찬가지로 main (return, main _only_)에서 return 문을 생략해도됩니다.이 경우 암시적인 'return 0'이 있습니다. 그래도 여전히 나쁜 습관입니다. –

+1

현재 C 표준 인 C99에는 없습니다. C99에는 '암시 적 int'반환 유형 등이 없습니다. –

0

pipefd 초기화하지 마십시오! 누락 된

pipe(pipefd); 

라인 전에 close 전화 ...?

관련 문제