• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

buf 선언에 따른 read() fail 문제

22.08.17 10:36 작성 조회수 125

0

위와 같이 calloc을 이용해서 buf를 선언할 경우 read() fail 문제가 발생하는데,

교수님의 코드와 같이 정적 어레이로 선언하면 코드가 정상적으로 돌아가는 것을 확인했습니다.

혹시 calloc으로 설정하면 안되는 이유가 있는지 여쭤보고 싶습니다. 

답변 2

·

답변을 작성해보세요.

1

안녕하세요. dannyscap님.

죄송하지만 지금 여행 중이라 코드 수준의 확인이 어렵습니다. 8월 29일에 복귀 예정이라 그 때 질문에 대한 답을 상세히 해드릴 수 있을 것 같습니다. 

제 개인 사정으로 빠르게 답변드리지 못해 죄송합니다. 양해 부탁드리겠습니다.

dannyscap님의 프로필

dannyscap

질문자

2022.08.17

답변 기다리고 있겠습니다 :)

0

안녕하세요. dannyscap님

오랜 기간 여행을 하고 오느라 이제야 답변드립니다. 답변이 늦어져 죄송합니다ㅠㅠ

inotify.c 파일에서 buf 변수를 array로 선언했을 땐 정상 동작하는데, buf를 pointer로 선언하고 calloc()으로 메모리를 할당받으면 read()에서 에러가 발생하는 원인에 대한 질문 주셨습니다.

fd로부터 데이터를 읽어올 버퍼를 정적으로 할당 받는 것과 동적으로 할당 받는 것은 read() 입장에서는 차이가 없습니다. 메모리만 제대로 준비되어 있으면 read()는 정상 동작할 수 있습니다.

먼저 체크해야 할 것은 calloc() 의 호출로 제대로 된 메모리를 할당 받았느냐 입니다. 물론 할당 받는 메모리 량이 적기 때문에 오류가 날 확률은 거의 없겠죠. 그래도 null check은 습관적으로 하는 것이 좋습니다.

실제 문제는 read() API 호출 부분일 것입니다. 강의 내에서 read()는 다음과 같이 호출됩니다.

ret = read(fd, buf, sizeof(buf));

실제 문제가 된 부분은 sizeof(buf) 일 것입니다. char buf[1024];와 같이 정적 어레이로 선언하면 sizeof(buf)의 값은 1024가 될 것입니다. 하지만 buf를 포인터로 선언하고 동적 메모리 할당을 받았을 때 sizeof(buf)의 값은 8 혹은 4(64-bit architecture에서는 8, 32-bit architecture에서는 4)가 됩니다. 여기에서 문제가 됐을 것 같네요.

버퍼 사이즈를 size_t bufsize = 1024 * sizeof(char);와 같이 선언하고,
버퍼 할당은 char *buf = (char *)calloc(1, bufsize);
read() 부분을 ret = read(fd, buf, bufsize); 로 변경하면 에러 없이 잘 수행될 것 같습니다.

추가 질문 있으시면 댓글 부탁드리겠습니다. 감사합니다~!