(운영체제프로그래밍)execve사용법에 관한 질문과 open&clos

jerryaa의 이미지

execve를 사용하기 위해서는

#include <unistd.h>
int execve(const char *filename, char *const argv [], char *const envp[]);

가 synopsis 인 것은 알겠습니다. 그런데 구체적으로 어떻게 쓰는 건지 궁금하네요. 예를 들어 cd,ln, rm, exit의 built in command가 아니라면 ls, echo, etc 등과 같은 것은 char* filename이 가리키는 새로운 프로그램이 되겠지요.

예를 들어 >b.c /bin/ls 라는 command line이 들어왔다고 가정을 할 때
여기서 char*filename에는 "/bin/ls"를 넘겨주고 > 다음의 b.c는 출력 파일이 되기 때문에 argv에 속하지 못하는 것 같습니다. 그러면

char* argv[]={"/bin/ls", (char*)0};
이 되는 건가요?

숙제에서 순서가 뒤죽박죽이 되더라도 인식하도록 만들어라고 하는데
예를 들어

filename /bin/gub -p1 -p2

라는 command line이 들어오면 const* filename="/bin/gub"를 보내주게 되는 것은 잘 알겠습니다.
실상 char* argv[]={"filename", "/bin/gub", "-p1", "-p2"}
이 되는데 (>,<,<<과 같은 redirection 이 없으므로) 이 순서를
char* argv[]={"/bin/gub","-p1", "-p2","filename"}과 같이 꼭 command program을 맨 처음으로 순서를 돌려줘서 execve에 보내줘야만 execve가 제대로 작동할 수 있는 건가요? 즉 문법적으로 순서를 제대로 다시 배열을 굳이 해 줘야 하나요?

command line이 filename /bin/gub -p1 -p2
과 같다면 execve은 어떻게 써져야 하는 건가요?(각각의 filename, argv[] 말입니다. envp만 그냥 0으로 두기로 합니다.)

마지막 질문인데

built in command (cd, ln, rm, exit)가 아닌 다른 command 즉 입력 command program이 뭔지 모르는 상태에서 redirection으로 처리할 수 있으려면 close(fp), open(fp)이 필요할 텐데 입력 받은 line에 redirection중 >나 <과 같이 입력 , 출력 중 하나만 존재하는 상태에서도 close(0),close(1),close(2)를 모두 닫아주고 같은 방식으로 open을 0,1,2에 대해 모두 수행해줘야 하나요?
아니면 output redirection이나 input에 대한 각각의 fp 만 닫아주고 열어주기만 하면 되는 건가요?
물론 error를 처리하려면 close(2) open(2)를 항상 명기해줘야 하겠지만요.

만약 execve를 쓴다면 시작하는 main함수는 일반적인 void형인 main()가 아닌 꼭 int main(int argc, char *argv[], char *envp[])의 형식으로 시작해야 하나요? 만약 command line을 먼저 입력 받는다면 read로 읽은 후에 parsing해야만 char* argv[]를 main함수로 보내줄 수 있을 텐데 그러면 가장 큰 void의 main()이 존재하고 그안에 sub형식으로
int main(int argc, char *argv[], char *envp[])함수를 다시 시작해줘야 하는 건가요?

그렇다면 fork는 int main(int argc, char *argv[], char *envp[])함수가 아니라 void의 main 함수 내에서 사용되어져야 하는건가요?

질문이 너무 많네요. 이렇게 기본적인 질문은 man page 만으로 이해하기는 너무 어렵던데 어디서 이런 것들을 알 수 있을 까요? 직접프로그래밍을 해봐야 알 수 있는 건가요? 문법조차 모르는데 프로그래밍해서 디버그하면서 알아내기는 불가능한 것 같고 이렇게 random으로 지식을 얻거나 다른 사람들에게 질문해서 알아내는 것은 너무 의존적인 것 같아 좀 더 독립적으로 자립적 공부방식을 찾고 싶은데 추천방식이 있으신지요?

기본적인 문법으로 C만 프로그래밍 할 줄 아는 상태에서 OS 만드는 수업을 듣는데 로드가 장난이 아닙니다. 첫번째 숙제가 shell을 만들어서 돌리게 하는 건데 문법도 감이 잘 안 잡혀서 이렇게 질문을 올립니다. 감사합니다...^^

jerryaa의 이미지

그런데 받은 command의 path는 어떻게 지정할 수 있을까요? 제가 쓰는 쉘에서 저는 "which /"command" "를 사용해서 알았는데 (예를 들어 ls 는 결과가 \bin\ls가 나오지요.) 컴퓨터에서는 임의적으로 받아들이는 그 명령의 path를 어떻게 알아낼 수 있나요?
입력하는 사람이 \bin\ls > b.c라고 치지 않고 ls> b.c라고 치면 틀린다고 error를 내야 하나요?

후회하지 않는 삶

saxboy의 이미지

http://saxboy.pe.kr/mywiki/index.php?display=UNIX%5FSystem%5FProgramming%5FTutorial

제가 강의 자료로 쓰는 페이지입니다. shell을 만드시거나 시스템 프로그래밍을 하시면 보실만한 샘플이 있을겁니다. 샘플이니 그냥 낼만한 수준의 코드도 아니지만 그래도 숙제하고 계시니 그대로 카피는 하지 마세요.
어느 정도 수준의 shell을 구현하시는지는 잘 모르겠지만, pipe와 redirection까지 처리를 해야 한다면 좀 귀찮은 스트링 처리를 많이 해야겠군요.

saxboy의 이미지

Quote:
그런데 받은 command의 path는 어떻게 지정할 수 있을까요? 제가 쓰는 쉘에서 저는 "which /"command" "를 사용해서 알았는데 (예를 들어 ls 는 결과가 \bin\ls가 나오지요.) 컴퓨터에서는 임의적으로 받아들이는 그 명령의 path를 어떻게 알아낼 수 있나요?
입력하는 사람이 \bin\ls > b.c라고 치지 않고 ls> b.c라고 치면 틀린다고 error를 내야 하나요?

getenv("PATH")

댓글 달기

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