(운영체제프로그래밍)execve사용법에 관한 질문과 open&clos
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을 만들어서 돌리게 하는 건데 문법도 감이 잘 안 잡혀서 이렇게 질문을 올립니다. 감사합니다...^^
그런데 받은 command의 path는 어떻게 지정할 수 있을까요? 제가
그런데 받은 command의 path는 어떻게 지정할 수 있을까요? 제가 쓰는 쉘에서 저는 "which /"command" "를 사용해서 알았는데 (예를 들어 ls 는 결과가 \bin\ls가 나오지요.) 컴퓨터에서는 임의적으로 받아들이는 그 명령의 path를 어떻게 알아낼 수 있나요?
입력하는 사람이 \bin\ls > b.c라고 치지 않고 ls> b.c라고 치면 틀린다고 error를 내야 하나요?
후회하지 않는 삶
http://saxboy.pe.kr/mywiki/index.php?dis
http://saxboy.pe.kr/mywiki/index.php?display=UNIX%5FSystem%5FProgramming%5FTutorial
제가 강의 자료로 쓰는 페이지입니다. shell을 만드시거나 시스템 프로그래밍을 하시면 보실만한 샘플이 있을겁니다. 샘플이니 그냥 낼만한 수준의 코드도 아니지만 그래도 숙제하고 계시니 그대로 카피는 하지 마세요.
어느 정도 수준의 shell을 구현하시는지는 잘 모르겠지만, pipe와 redirection까지 처리를 해야 한다면 좀 귀찮은 스트링 처리를 많이 해야겠군요.
[quote]그런데 받은 command의 path는 어떻게 지정할 수 있
getenv("PATH")
댓글 달기