메인 함수(main func)에서 인수(parameter)들?

tristansong의 이미지

메인 함수(main func)에서 인수(parameter)들은 어디서 처리하는지요, 정확히 어떻게 파싱하는지 궁금합니다.

int main( int argc, char**argv)

위 **argv를 어디서 처리하는지 정말 궁금합니다.

File attachments: 
첨부파일 크기
Image icon ProgramStartNTermination.JPG43.22 KB
yeppiguy의 이미지

프로그램 실행 파라미터에 관한 부분입니다.
만일, 실행파일이 a.out 일 경우,
> a.out para1 para2

이렇게 입력하시고 실행하면,
argc는 3이고,
argv[0]=a.out
argv[1]=para1
argv[2]=para2
가 들어갑니다.

argv가 더블포인터인거는 스트링의 배열이기 떄문입니다.
한번 코드 짜서 프린트 해 보세요.

명령 파라미터 파싱은 strcmp이용해서 파싱을 다 하셔도 되는데, 특별히 "-h" 같은 옵션 파라미터를 처리하고자 할 경우라면,
getopt() 함수도 함께 활용하세요.

man getopt

tristansong의 이미지

답변 감사합니다.

제가 알고 싶은것은 셀(Shell) 혹은 커널(kernel)에서 인수(parameter)들을 처리하는 함수가 어떤것인가 하는 것입니다.

일단 셀(Shell)에서 라인 코멘드(line command)을 주면 자동(?)으로 파싱하는데 이걸 어디서 처리하는 지가 궁금합니다.

yeppiguy의 이미지

커널은 아니구요.... 셀에서 처리하는데요,
쉘두 어차피 응용프로그램이라구 생각하셔야 합니다.

님 사용하시는 bash같은거 소스 구해다 보시면, 도움이 될겁니다.
간단한 걸 원하시면, busybox에 있는 ash소스에서, ash_main()함수를 보시면 도움이 될지도...

tristansong의 이미지

잘 알겠습니다.

그런데 또 궁금증이 생겨서,

1. 유닉스(Unix)나 리눅스(Linux)들에는 셀(Shell)이라는 매개체가 있어서 유저(User)와 커널(Kernel)사이의 의사 소통을 돕는데 그럼, 셀(Shell)에서 파싱(Parsing)을 처리하면 커널(Kernel)에서는 이 파싱(Parsing) 값들을 어떻게 받아 들이는 가요?

2. 위 1와 같이 조건은 vc++같은 프로그램에서 어떻게 파싱(Parsing)이 만들어 지는지요, 즉, 셀(Shell)의 역활은 어떤 프로그램이 담당합니까?

Prentice의 이미지

1. 커널에서 받지 않고, 유저스페이스에서 처리합니다.
2. 윈95의 경우 explorer.exe가 셸입니다. 윈98부터는 Internet Explorer가 셸의 역할도 합니다.

revizes의 이미지

tristansong wrote:
답변 감사합니다.

제가 알고 싶은것은 셀(Shell) 혹은 커널(kernel)에서 인수(parameter)들을 처리하는 함수가 어떤것인가 하는 것입니다.

일단 셀(Shell)에서 라인 코멘드(line command)을 주면 자동(?)으로 파싱하는데 이걸 어디서 처리하는 지가 궁금합니다.

exec 계열의 function에서 하는걸로 기억이..
예전에 스티븐슨 책에서 본것 같은데요...
어차피 그냥 생각해봐도 shell에서 fork해서 프로그램을 실행 시킬테니깐..
exec 함수가 맞을 것 같은데요..^^

다 덤벼! 다 받아줄께!!

tristansong의 이미지

답글에 감사합니다.

"검은해"님께 질문있습니다.

Quote:
1. 커널에서 받지 않고, 유저스페이스에서 처리합니다.

"유저스페이스"란 통상 무엇을 가르키고 여기서 쓰임은 어떤 뜻입니까?

"revizes"님 답글 감사합니다.
근데 부탁있습니다.
방금 저도 man페이지를 뒤져서execv들을 확인 해 본 결과 여기 함수들도 메인에서 주어진 것들을 쓰거나 사용자가 파싱한 값을 쓰는 것 같은데 제가 잘못 이해 했을 수도 있느니 확인해 주실 수 있겠습니까?

morris의 이미지

사실 c의 main은 제일 처음에 불려지는 function은 아닙니다

CRT(c runtime library)에서 먼저 main이 뜰수있게

argc, **argv에 값을 넣어주고 여러가지 셋팅을 합니다.

그 부분이 다 유저스페이스에서 이뤄지죠.

exec*계열 함수들은 그냥 쉘에서 실행한거랑 비슷합니다.

따라서 실행 파일에서 crt가 실행되고 main이 실행되겠죠

crt로 찾으시면 원하는거 보실수 있으실겁니다

morris의 이미지

좋은 글 두개가 있어서 첨부합니다.

http://www.joinc.co.kr/modules.php?op=modload&name=Forum&file=viewtopic&topic=28855&forum=1&2

http://www.linuxgazette.com/issue84/hawk.html

windows에서 visual c++도 마찬가지입니다.

tristansong의 이미지

제 글에 답글 해 주신 모든 분께 감사합니다.

특히, "morris"님 글에 감사 합니다.

제가 ㅤㅊㅏㅊ아 본 결과를 말씀드리면 일단 "morris"님의 글이 맞는 것 같습니다. 리눅스 커널 2.6.11.10 버전에서 lib 디렉토리의 "cmdline.c" 소스가 있는데 거기서 일단 라인 명령들을 처리하는 것 같습니다.

혹시 잘못 이해했을 수도 있으니 의견 부탁드립니다.

revizes의 이미지

morris wrote:
사실 c의 main은 제일 처음에 불려지는 function은 아닙니다

CRT(c runtime library)에서 먼저 main이 뜰수있게

argc, **argv에 값을 넣어주고 여러가지 셋팅을 합니다.

그 부분이 다 유저스페이스에서 이뤄지죠.

exec*계열 함수들은 그냥 쉘에서 실행한거랑 비슷합니다.

따라서 실행 파일에서 crt가 실행되고 main이 실행되겠죠

crt로 찾으시면 원하는거 보실수 있으실겁니다

책에서 찾아보니 이 그림이 있는데..모리스님이 말씀하신
내용하고 약간 차이가 있는것 같은데..
잘 모르겠습니다. ^^[img][/img]

댓글 첨부 파일: 
첨부파일 크기
Image icon 0바이트

다 덤벼! 다 받아줄께!!

댓글 달기

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