Study with Me!
Seongmo
Study with Me!
전체 방문자
오늘
어제
  • Computer (126)
    • Computer Science (61)
      • Data Structure (51)
      • Algorithm (6)
      • 선형대수 with C++ (4)
    • Arm Architecture (1)
      • Register (0)
      • Assembly Instruction (1)
    • Linux (30)
      • Linux Kernel (4)
      • 라이브러리 함수 구현하기 (0)
      • 쉘, 쉘 명령어 구현하기 (15)
      • Ubuntu (11)
    • AWS (3)
    • Baekjoon (18)
    • Tools (6)
      • Git & Github (5)
      • Vim (1)
    • 개발 환경 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • STL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Study with Me!

Seongmo

[쉘 구현하기] fork(), exec()류 함수 호출 시 실행인자 주기
Linux/쉘, 쉘 명령어 구현하기

[쉘 구현하기] fork(), exec()류 함수 호출 시 실행인자 주기

2023. 8. 11. 16:57

 

[쉘 구현하기] 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
    'Linux/쉘, 쉘 명령어 구현하기' 카테고리의 다른 글
    • [쉘 구현하기] ls 명령어 -l 옵션 추가
    • [쉘 구현하기] ls 명령어 -a 옵션 추가
    • [쉘 구현하기] execv() 사용을 위한 문자열 배열 만들기
    • [쉘 구현하기] ls 명령어 터미널 크기에 최적화
    Study with Me!
    Study with Me!
    Study with Me!

    티스토리툴바