getpgid(),getdrent() 이런 함수들 사용할때 문제가 생기는데요.
글쓴이: 익명 사용자 / 작성시간: 목, 2002/07/11 - 4:33오후
디렉토리 정보를 가져오는 함수인 getdents라는 함수를 사용하면
컴파일할때 항상 선언되지 않은 함수라고 나오는군요...
왜 이러는지 모르겠습니다.
man page를 보면,
unistd.h
linux/types.h
linux/dirent.h
linux/unistd.h
이렇게 포함하면 된다고 나와 있는데요...
왜 계속 선언되지 않은 함수라고 나오는지 모르겠네요...
아울러 readdir도 마찬가지 입니다....
왜 이러는지 아는 고수분들 좀 가르쳐 주세요~~~
그럼 이만 해답을 기다리겠습니다~
추가질문으로 프로세스의 그룹 아이디를 얻어오는 함수인
getpgid()함수를 사용할때도 man page에 보면
unistd.h 만 인클루드하면 된다고 하거든요
유닉스 레퍼런스를 보면 sys/types.h 도 하라고 해서
이것도 해봤구요...
그런데 이건도 선언되지 않은 함수라고 나오네요...
왜 자꾸 이러는건지 모르겠습니다....ㅡㅡ;
고수님들 좀 가르쳐 주세요~~~
그럼이만...
Forums:
저도 같은 에러납니다.
undefined reference to `getdents'라고...
#include <stdio.h>
#include <string.h>
#include <ctype.h> /* isdigit() */
#include <sys/file.h> /* O_RDONLY , L_SET */
#include <sys/dir.h> /* getdents() */
#include <sys/stat.h> /* IS_macros */
#include <sys/types.h> /* mode_t */
#include <time.h> /* localtime, asctime */
#include <unistd.h>
#include <linux/types.h>
#include <linux/unistd.h>
로 헤더파일 인클루드 해주고 아래 코드에서는
/* 명명된 디렉토리에 있는 모든 파일들 처리 */
void processDirectory(char* dirName)
{
int fd,
charsRead;
struct direct dirEntry;
char fileName[MAX_FILENAME];
fd = open(dirName, O_RDONLY); // 읽기위해 디렉토리 열기
if(fd == -1) fatalError();
while(TRUE)
{
charsRead = getdents(fd, &dirEntry, sizeof(struct dirent));
..... (중략)
close(fd);
}
을 해주었는데..
적당한 헤더파일을 포함시켜달라고 계속 그러네요.
뭘 추가해야하는 건지..
아래는 에러내용입니다.
[jin@XXXSERVER monitor]$ gcc monitor.c -o monitor
monitor.c: In function `processOptions':
monitor.c:96: warning: comparison between pointer and integer
/tmp/cc4YerFk.o(.text+0x3fb): In function `processDirectory':
: undefined reference to `getdents'
collect2: ld returned 1 exit status
With Everlasting Passion about new Tech. and Information!
#include <dirent.h>이거 빠져 있는듯 한데요
#include <dirent.h>
이거 빠져 있는듯 한데요?
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
제 시스템의 /usr/include/sys 를 보면
dir.h 가 있습니다.
이걸 까보면
#ifndef _SYS_DIR_H
#define _SYS_DIR_H 1
#include <features.h>
#include <dirent.h>
#define direct dirent
#endif /* sys/dir.h */
따라서 dir.h 만 인클루드 해 준건데요.
-내부적으로 #include <dirent.h> 하니까요.
말씀해주신데로 함 해봤는데 마찬가지입니다..흠.
일단 계속 매달릴 수 없어 다른 부분을 보고 있어욧.
언제든 해결은 해야지요.
답변 감사합니당.. :lol:
With Everlasting Passion about new Tech. and Information!
readdir(), readdir_r()
readdir(), readdir_r() 계열을 쓰시는건 어떨까요?
getdents() 함수의 man 페이지를 보시면,
라고 나오기도 하고... getdents() 는 POSIX 호환 함수가 아니라서리
차후에 문제가 생길수도 있죠.
그리고도, readdir(), readdir_r() 은 getdents() 가 하는 역할을 그대로 수행하면서
POSIX 함수이기도 하죠.
헤더가 아니라
적당한 헤더가 아니라 적당한 라이브러리 링크를 해달라는 앙탈입니다 :$
-l삐리리 ( 소문자 엘 ) 로 적당한 라이브러리를 링크해주세요.
솔라리스에는 /usr/include/sys/dir.h 에 보면
솔라리스에는
/usr/include/sys/dir.h
에 보면 system call함수로
getdents() 이 external 로 선언되어 있어요.
근데 리눅스에는 없네요?
당근 man 페이지도 없어요.
With Everlasting Passion about new Tech. and Information!
넵.링킹 라이브러리를 찾기위하여
링킹해줄 라이브러리를 찾기위하여
1./usr/include 에서 > grep getdents *.h
하니까
libsmbclient.h: int (*getdents)(SMBCCTX *c, SMBCFILE *dir,
libsmbclient.h: * @see smbc_getdents(), smbc_readdir(), smbc_closedir()
libsmbclient.h: * smbc_getdents() reads as many dirent structures from the an open
해서 libsmbclient.h 라는 놈이 그 놈이라는 것을 알아낸후
2. /usr/lib 로 이동하여 ls -l libsmbclient*
하니까
libsmbclient.a
libsmbclient.so
이 나옵니다.
3. libsmbclient.so 로 의심이 되는 바
4. 아래와 같이 -l 옵션 사용
>gcc monitor.c -o monitor -l/usr/lib/libsmbclient.so
하였는 데
마찬가지입니다.
제가 잘 못 접근한것인가요? (제 멋대로 사용한 거 같기도 함. :roll: )
-l 옵션 사용을 잘 몰라서..
With Everlasting Passion about new Tech. and Information!
근데 결정적으로 libsmbclient.h 안을 까보면 getd
근데 결정적으로
libsmbclient.h 안을 까보면
getdents() 는 없고
int smbc_getdents(unsigned int dh, struct smbc_dirent *dirp, int count);
는 있는 데..
이 함수를 대신 사용했는데-getdents() 대신
역시 마찬가지군요.
허허...도무지 ... 도/무/지.
With Everlasting Passion about new Tech. and Information!
man getdents 하면 이렇게 나옵니다.[code:1]
man getdents 하면 이렇게 나옵니다.
_syscall3 이라는 게 보이는데, 아마도 이걸 빼먹으셨을 겁니다. 매크로인데, 실제 제 시스템에서 대강 다음과 같이 전개됩니다.고로 라이브러리나 헤더를 뒤지는 건 별 소용이 없습니다. 저 매크로를 이용해서 함수를 별도로 정의해주세요.
(물론 이보다는 readdir() 쪽을 추천합니다만, 굳이 꼭 getdents() 를 쓰셔야겠다면 말입니다.)
p.s. 오타 수정했습니다. (getdirents->getdents)
해결이 되었습니다.
언급하신 대로 매크로
_syscall3(int, getdents, uint, fd, struct dirent *, dirp, uint, count);
헤더는 요렇게..
#include <stdio.h>
#include <string.h>
#include <ctype.h> /* isdigit() */
#include <sys/file.h> /* O_RDONLY , L_SET */
#include <sys/dir.h> /* getdents() */
#include <sys/stat.h> /* IS_macros */
#include <sys/types.h> /* mode_t */
#include <time.h> /* localtime, asctime */
#include <unistd.h>
#include <linux/types.h>
#include <linux/unistd.h>
// #include <linux/dirent.h>
을 선언하여 주니 말끔히 컴파일이 되는 군요.
정말 감사합니다. :P
역시 살아있는 BBS(불교방송아니고..)
p.s: but, 여전히 man getdirents 는 수행되지 않습니다..
With Everlasting Passion about new Tech. and Information!
Re: 해결이 되었습니다.
아차차 실수. -_-;
man getdents 입니다. -_-;; 죄송합니다.
웅...man getdents 역시 제 한컴 리눅스 베타 2
웅...
man getdents 역시
제 한컴 리눅스 베타 2 에는 없구..
솔라리스에는 있네요.
System call 로써..
답변 감사..ㅋㅋ
With Everlasting Passion about new Tech. and Information!
댓글 달기