2012-07-09 3 views
2

accept() 함수를 가로 채는 LD_PRELOAD를 작성했습니다. 가끔 함수를 받아 들일 때 나에게 같은 파일 기술자를주기 때문에 나는 문제가있다. 나는 단지 하나 개의 프로세스Linux에서 accept 할 때 동일한 SOCKET id입니까?

이 프리로드를로드

내 코드 :

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) 
{ 
int fd; 
fd = (*realAccept)(sockfd, addr, addrlen); 
if(fd >= 0) 
{ 
    printf("file descriptor: %d\n", fd); 
    ... 
    return fd; 
} 
} 

int close(int fd) 
{ 
printf("close decriptor: %d\n", fd); 
return (*realClose)(fd); 
} 

출력은 다음과 같습니다

파일 설명 : 213

파일 설명 : 213 < - 왜?

...

가까운 decriptor : 213

왜 기능은 동일한 파일 기술자를 반환 받아?

감사합니다.

+0

아마도 연결을 수락 한 후 accept 함수를 사용하여 다른 정보를 인쇄 할 수 있습니다. 프로세스의 pid 및 그 pid에 대한'lsof -p % u'의 출력. 'system' 호출은 후자를 달성 할 수 있습니다. – MvG

+0

이 사전로드를 하나의 프로세스에만로드하십시오. – Robert

+0

프로세스가'fork() '를 호출하지 않았습니까? – rodrigo

답변

0

나는 이것이 stdout의 버퍼링으로 인한 오류라고 생각합니다. 어쩌면 그것을 사용하는 다른 스레드가있을 수 있습니다 ... 당신은 끝 \n을 포함하지 않았다는 사실에 덧붙여 결과물에 중복 된 라인이 생길 수 있습니다.

확실한 경우 printf()을 호출 할 때마다 \n을 문자열 끝에 추가하고 fflush(stdout)을 추가하십시오.

+0

과 fflush가 같은 것 – Robert

+0

전역 변수를 출력하고 매번 증가 시켜서 두번 호출하는 것이 가능합니까? :'printf ("파일 설명자 : % d % d \ n", fd, global ++); – rodrigo