close(fildes)....

leolo의 이미지

다음과 같이 사용하는데 있어서...

int error;
...
if(close(fildes) == -1){
     error = errno;
     fprintf(stderr, "Failed to close file descriptor %d : %s\n", fildes, strerror(errno));
     errno = error;
}

에러넘버를 이와 같이 임시로 저장하는 이유가 무엇인가요?
만약, close() 함수에서 -1이 되어 에러가 발생하고 errno가 9번이 되어 invalid file descriptor이 될 경우, errno가 다른 프로세스에 의해서 변화되지 않도록하는 것인가요. 좀 알려주세요...

dreampia의 이미지

int error; 
... 
if(close(fildes) == -1){ 
     error = errno; 
     fprintf(stderr, "Failed to close file descriptor %d : %s\n", fildes, strerror(errno)); 
     errno = error; 
} 

아주 이상하군요.. multi-threads 라면 errno가 전역변수라서 대강 비슷한 방법이 맞는 것 같은데, errno를 error에 넣은 후에 strerror(error) 로 찍어야지 왜 strerror(errno)로 찍은건지 이해가 안 되는군요..

multi-threads에서 errno를 찍을 경우 다른 threads에 의해 변경된 값이 찍히는 경우가 많아서 아마도 위와 같이 했다고 생각합니다.

저도 multi-threads에서 위와 비슷하게 처리하거든요^^;

>/dev/null 2>&1

marten의 이미지

아마도 fprintf 함수가 errno를 set하기 때문이 아닐까 싶습니다.
그러니까 fprintf 함수를 부르기 이전에 errno를 저장해야겠죠.

최종호의 이미지

dreampia wrote:
int error; 
... 
if(close(fildes) == -1){ 
     error = errno; 
     fprintf(stderr, "Failed to close file descriptor %d : %s\n", fildes, strerror(errno)); 
     errno = error; 
} 

아주 이상하군요.. multi-threads 라면 errno가 전역변수라서 대강 비슷한 방법이 맞는 것 같은데, errno를 error에 넣은 후에 strerror(error) 로 찍어야지 왜 strerror(errno)로 찍은건지 이해가 안 되는군요..

multi-threads에서 errno를 찍을 경우 다른 threads에 의해 변경된 값이 찍히는 경우가 많아서 아마도 위와 같이 했다고 생각합니다.

저도 multi-threads에서 위와 비슷하게 처리하거든요^^;

caller 에게 close의 errno 를 전달하는 것 외에는
멀티스레드를 위한 고려로는 생각되지 않습니다.

/usr/include/errno.h (또는 이 녀석이 참조하는 헤더파일)
을 보시면 multi-thread인 경우와 그렇지 않은 경우에
errno 의 정의가 다르게 되어있는 것을 확인하실 수 있을 것입니다.
MT 세이프하게 errno를 사용하시는 방법은 _REENTRANT 등을 사용해서
명시적으로 MT환경에서 접근한다는 것을 알려주는 방법입니다.

leolo의 이미지

답변 감사드립니다.

참고로 제가 unix systems programming communication, concurrency, and threads를 보고 있습니다.

실력이 있으면 삶이 편하다... 영차 영차...