getpgid(),getdrent() 이런 함수들 사용할때 문제가 생기는데요.

익명 사용자의 이미지

디렉토리 정보를 가져오는 함수인 getdents라는 함수를 사용하면
컴파일할때 항상 선언되지 않은 함수라고 나오는군요...
왜 이러는지 모르겠습니다.

man page를 보면,

unistd.h
linux/types.h
linux/dirent.h
linux/unistd.h

이렇게 포함하면 된다고 나와 있는데요...
왜 계속 선언되지 않은 함수라고 나오는지 모르겠네요...
아울러 readdir도 마찬가지 입니다....

왜 이러는지 아는 고수분들 좀 가르쳐 주세요~~~
그럼 이만 해답을 기다리겠습니다~

추가질문으로 프로세스의 그룹 아이디를 얻어오는 함수인
getpgid()함수를 사용할때도 man page에 보면

unistd.h 만 인클루드하면 된다고 하거든요
유닉스 레퍼런스를 보면 sys/types.h 도 하라고 해서
이것도 해봤구요...

그런데 이건도 선언되지 않은 함수라고 나오네요...

왜 자꾸 이러는건지 모르겠습니다....ㅡㅡ;

고수님들 좀 가르쳐 주세요~~~
그럼이만...

initiative의 이미지

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 <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

initiative의 이미지

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!

kslee80의 이미지

readdir(), readdir_r() 계열을 쓰시는건 어떨까요?

getdents() 함수의 man 페이지를 보시면,

Quote:
DESCRIPTION
This is not the function you are interested in. Look at readdir(3) for
the POSIX conforming C library interface. This page documents the bare
kernel system call interface.

라고 나오기도 하고... getdents() 는 POSIX 호환 함수가 아니라서리
차후에 문제가 생길수도 있죠.

그리고도, readdir(), readdir_r() 은 getdents() 가 하는 역할을 그대로 수행하면서
POSIX 함수이기도 하죠.

cocas의 이미지

적당한 헤더가 아니라 적당한 라이브러리 링크를 해달라는 앙탈입니다 :$

-l삐리리 ( 소문자 엘 ) 로 적당한 라이브러리를 링크해주세요.

initiative의 이미지

솔라리스에는
/usr/include/sys/dir.h

에 보면 system call함수로
getdents() 이 external 로 선언되어 있어요.

근데 리눅스에는 없네요?
당근 man 페이지도 없어요.

With Everlasting Passion about new Tech. and Information!

initiative의 이미지

링킹해줄 라이브러리를 찾기위하여

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!

initiative의 이미지

근데 결정적으로
libsmbclient.h 안을 까보면
getdents() 는 없고
int smbc_getdents(unsigned int dh, struct smbc_dirent *dirp, int count);

는 있는 데..
이 함수를 대신 사용했는데-getdents() 대신
역시 마찬가지군요.

허허...도무지 ... 도/무/지.

With Everlasting Passion about new Tech. and Information!

singlet의 이미지

man getdents 하면 이렇게 나옵니다.

       #include <unistd.h>
       #include <linux/types.h>
       #include <linux/dirent.h>
       #include <linux/unistd.h>

       _syscall3(int, getdents, uint, fd, struct dirent *, dirp, uint, count);

       int getdents(unsigned int fd, struct dirent *dirp, unsigned int count);
_syscall3 이라는 게 보이는데, 아마도 이걸 빼먹으셨을 겁니다. 매크로인데, 실제 제 시스템에서 대강 다음과 같이 전개됩니다.
int
getdents(unsigned fd, struct dirent *dirp, unsigned count)
{
    return syscall(141, fd, dirp, count);
};
고로 라이브러리나 헤더를 뒤지는 건 별 소용이 없습니다. 저 매크로를 이용해서 함수를 별도로 정의해주세요.

(물론 이보다는 readdir() 쪽을 추천합니다만, 굳이 꼭 getdents() 를 쓰셔야겠다면 말입니다.)

p.s. 오타 수정했습니다. (getdirents->getdents)

initiative의 이미지

언급하신 대로 매크로
_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!

singlet의 이미지

아차차 실수. -_-;

man getdents 입니다. -_-;; 죄송합니다.

initiative wrote:
p.s: but, 여전히 man getdirents 는 수행되지 않습니다..
initiative의 이미지

웅...

man getdents 역시
제 한컴 리눅스 베타 2 에는 없구..

솔라리스에는 있네요.
System call 로써..

답변 감사..ㅋㅋ

With Everlasting Passion about new Tech. and Information!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.