[쉘 구현하기] execv() 사용을 위한 문자열 배열 만들기
exec()류 함수를 사용할 때 실행 인자를 전달하기 위해 공백을 포함한 문자열을 공백(탭)을 기준으로 분리하는 함수를 구현하려고 한다. 이것을 만드는 목적은 명령어를 호출할 때 옵션을 사용할
seongmoahn.tistory.com
위 글에서 공백을 포함한 문자열을 분리하는 함수를 구현해 my_header.h 파일에 추가해줬다.
prompt() 함수에서 입력받은 명령어 라인을 divideString() 함수를 통해 문자열 배열 argList로 변환했다.
이것을 lsExec()의 인자로 전달해줘 ls()의 실행 인자로 전달되도록 코드를 수정했다.
// SM_shell.c
#include "my_header.h"
...
void lsExec(char **argList) {
pid_t pid;
if ((pid = fork()) < 0) {
fprintf(stderr, "fork error\n");
exit(1);
}
else if (pid == 0) {
execv(execName, argList);
exit(0);
}
else {
pid = wait(NULL);
}
}
...
void prompt() {
char input[STR_MAX];
int command;
int argCnt;
char **argList = NULL;
while (1) {
printf("SM_shell > ");
fgets(input, STR_MAX, stdin);
input[strlen(input) - 1] = '\0';
if ((argList = divideString(input, &argCnt, " \t")) == NULL) {
continue;
}
...
if (command & CMD_HELP || command == NOT_CMD) {
helpExec();
} else if (command & CMD_LS) {
lsExec(argList);
}
}
}
int main(int argc, char **argv) {
init();
strcpy(execName, argv[0]);
if (!strcmp(argv[0], "help")) {
help();
} else if(!strcmp(argv[0], "ls")) {
ls(argc, argv);
}
else {
prompt();
}
exit(0);
}
my_ls.c 파일의 main()에서 인자를 전달받을 수 있도록 수정해줬다.
// my_ls.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <dirent.h>
...
void ls(int argc, char **argv) {
makeList();
getTerminalWidth("termWidth.txt");
printList();
deleteNode();
printf("\n\n");
}
앞으로 ls 명령어에서 사용할 인자들을 하나씩 추가해보자.
위 코드는 아래 이미지를 클릭해 깃허브에서도 확인할 수 있다.
'Linux > 쉘, 쉘 명령어 구현하기' 카테고리의 다른 글
[쉘 구현하기] ls 명령어 -l 옵션 추가 (0) | 2023.08.11 |
---|---|
[쉘 구현하기] ls 명령어 -a 옵션 추가 (0) | 2023.08.11 |
[쉘 구현하기] execv() 사용을 위한 문자열 배열 만들기 (0) | 2023.08.11 |
[쉘 구현하기] ls 명령어 터미널 크기에 최적화 (0) | 2023.08.09 |
[쉘 구현하기] ls 명령어 구현 (0) | 2023.08.09 |