ls 와 같은 명령어 어떻게 만들수 있을까요?

khaic0c0의 이미지

심심해서 웹 서핑을 하다가 어떤 분이 이런 질문을 했는데...
몇일 C 공부해본 저도 이런거 어떻게 만들수 있는지가 궁금해졌습니다.

http://www.linuxmaker.pe.kr/board/detail?table=qna_board&sn=362&page=1&ref=274&so=&sk=

이것이 링크입니다.

퍼왔어요..

리눅스 공부를 하고있는 학생인데요 

초보라서 섭도 잘못따라가고 있습니다..숙제가 

ls명령어를 구현하는것인데 파일이름 파일크기 파일타입출력을하고 

디렉토리라면 그안의 파일까지 출력하는 프로그램이요 

단, opendir,readdir사용하지말고요~~ 

어떻게 하라는건지 도저히.. 

좀갈켜주세요 

답변 해주시기 곤란하면..
초보인 제가 어떻게 접근해야 할지 조언이라도 해주시면 정말 감사하겠습니다.

simpid의 이미지

khaic0c0 wrote:
심심해서 웹 서핑을 하다가 어떤 분이 이런 질문을 했는데...
몇일 C 공부해본 저도 이런거 어떻게 만들수 있는지가 궁금해졌습니다.

[url]http://www.linuxmaker.pe.kr/board/detail?table=qna_board&sn=362&page=1&ref=274&so=&sk= [/url]

이것이 링크입니다.

퍼왔어요..

리눅스 공부를 하고있는 학생인데요 

초보라서 섭도 잘못따라가고 있습니다..숙제가 

ls명령어를 구현하는것인데 파일이름 파일크기 파일타입출력을하고 

디렉토리라면 그안의 파일까지 출력하는 프로그램이요 

단, opendir,readdir사용하지말고요~~ 

어떻게 하라는건지 도저히.. 

좀갈켜주세요 

답변 해주시기 곤란하면..
초보인 제가 어떻게 접근해야 할지 조언이라도 해주시면 정말 감사하겠습니다.

저도 이번에 Linux프로그래밍을 시작하면서 이곳에서 질문하고 풀었던 문제인데...

질문의 내용을 보면 숙제의 내용이 opendir, readdir을 사용안하는것 같은데...
opendir, readdir을 사용 안하고 방법이 있는겁니까?

궁금하군요...^^;

저의 경우 opendir, readdir, stat, fnmatch등을 이용했습니다.

khaic0c0의 이미지

ㅇ ㅏ.. ^^;

그게 힘든건가보죠?

그렇다면 만들었다는 소스좀 같이 올려주시면 좋을것 같은데요.. ^^;

어딜 가든 필요한 인간되자~~ :-)

simpid의 이미지

khaic0c0 wrote:
ㅇ ㅏ.. ^^;

그게 힘든건가보죠?

그렇다면 만들었다는 소스좀 같이 올려주시면 좋을것 같은데요.. ^^;

^^;
그럼 제가 만든 소스 올려드리겠습니다.
프로젝트 자체가 소스코드 레벨에서 Windows와 Linux 겸용이라.. 좀 지져분합니다.

#ifdef WIN32
	typedef HANDLE FILE_HANDLE;

	typedef struct
	{
		struct _finddata_t find_data;
	}FILE_FIND_DATA;
#else
	typedef int FILE_HANDLE;

	typedef struct
	{
		char* p_dirname;
		char* p_basename;

		DIR* dp;
		struct dirent* dirp;
	}FILE_FIND_DATA;
#endif

char* SFTSVR_API path_dirname(const char* p_path)
{
#ifdef WIN32
	char drive[_MAX_DRIVE];
	char path[_MAX_PATH];
	char fname[_MAX_FNAME];
	char ext[_MAX_EXT];
	char* p_result;

	assert(p_path);

	if((p_result = (char*)malloc(_MAX_PATH)) == NULL) return NULL;

	_splitpath(p_path, drive, path, fname, ext);
	_makepath(p_result, drive, path, "", "");

	return p_result;

#else
	char* p_result;
	char* p_tmp;

	assert(p_path);

	if((p_tmp = strdup(p_path)) != NULL)
	{
		p_result = strdup(dirname(p_tmp));
		free(p_tmp);
		return p_result;
	}
#endif

	return NULL;

}

char* SFTSVR_API path_basename(const char* p_path)
{
#ifdef WIN32
	char drive[_MAX_DRIVE];
	char path[_MAX_PATH];
	char fname[_MAX_FNAME];
	char ext[_MAX_EXT];
	char* p_result;

	assert(p_path);

	if((p_result = (char*)malloc(_MAX_PATH)) == NULL) return NULL;

	_splitpath(p_path, drive, path, fname, ext);
	_makepath(p_result, "", "", fname, ext);

	return p_result;

#else
	char* p_result;
	char* p_tmp;

	assert(p_path);

	if((p_tmp = strdup(p_path)) != NULL)
	{
		p_result = strdup(basename(p_tmp));
		free(p_tmp);
		return p_result;
	}
#endif

	return NULL;
}

const char* SFTSVR_API file_find_first(const char* p_path, FILE_FIND_DATA* p_find_data)
{
#ifdef WIN32
	_

#else
	const char* p_result;

	assert(p_path);
	assert(p_find_data);

	// 파일 이름과 디렉터리 경로의 분리
	if((p_find_data->p_dirname = path_dirname(p_path)) == NULL) return NULL;
	if((p_find_data->p_basename = path_basename(p_path)) == NULL)
	{
		free(p_find_data->p_dirname);
		return NULL;
	}

	if((p_find_data->dp = opendir(p_find_data->p_dirname)) != NULL)
	{
		if((p_result = file_find_next(p_find_data)) != NULL)
		{
			return p_result;
		}

		closedir(p_find_data->dp);
	}

	free(p_find_data->p_dirname);
	free(p_find_data->p_basename);
#endif

	return NULL;
}

const char* SFTSVR_API file_find_next(FILE_FIND_DATA* p_find_data)
{
	assert(p_find_data);

#ifdef WIN32
#else
	while((p_find_data->dirp = readdir(p_find_data->dp)) != NULL)
	{
		if(strcmp(p_find_data->dirp->d_name, ".") == 0) continue;
		if(strcmp(p_find_data->dirp->d_name, "..") == 0) continue;

		if(fnmatch(p_find_data->p_basename, p_find_data->dirp->d_name, 0) == 0)
		{
			return p_find_data->dirp->d_name;
		}
	}
#endif

	return NULL;
}

void SFTSVR_API file_find_close(FILE_FIND_DATA* p_find_data)
{
	assert(p_find_data);

#ifdef WIN32
#else
	closedir(p_find_data->dp);

	free(p_find_data->p_dirname);
	free(p_find_data->p_basename);
#endif

	return;
}

좀 지져분 하죠?

사용은 이렇게 합니다.

FILE_FIND_DATA find_data;
const char* p_found_file;

if((p_found_file = file_find_first("/home/simpid/*.c", &find_data)) != NULL)
{
	do
	{
		printf("Found : %s\n", p_found_file);
	}while((p_found_file = file_find_next(&find_data)) != NULL);

	file_find_close(&find_data);
}

진행중인 프로젝트에서 잘라서 붙인거라.. 지져분 합니다.

알아서 분석해보시고.. 도움 됐으면 좋겠네요.

Necromancer의 이미지

fopen(), fread() 이정도로는 어림 없구요.

시스템 콜 중에 ls 명령을 구현할 수 있는 다양한 것들이 나와 있습니다.

알아보세요.

어떤 경우에는 어셈블리 레벨까지 내려가야 하는 경우도 있답니다.

Written By the Black Knight of Destruction

another-park의 이미지

디렉토리도 파일처럼 똑같이 inode로 읽어서 처리하면 됩니다.

C언어로만 짜는 것 맞구요.

과목이 시스템 프로그래밍 아닌지요?

혹시 우리학교 컴공과가 아닌지...

교수님이 니콜라스 케이지하고 분위기 비스무리 하죠?

xfmulder의 이미지

man opendir 해보면
opendir(3)
섹션 3 에 있습니다. 즉, 라이브러리 입니다.

man -s 2 read 해보면 read(2) 가 있습니다.
즉, 시스템콜입니다. (진짜로 사용하는 함수입니다.)
이걸로 짜시면 됩니다.

또 stat() 도 있고....

내 자식들도 나처럼 !!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.