[Pipex] 사용가능 함수 - access, unlink, dup/dup2

Yejin Kim·2022년 5월 20일
0

42 cursus

목록 보기
8/20

NEW functions 👀

파일을 다루는 함수들에 대해서 알아보자

📍 access

#incude <unistd.h>

int access(const char *pathname, int how)

프로세스가 pathname에 해당하는 파일에 대해 읽기, 쓰기, 실행 권한을 가지는지를 확인할 수 있도록 하는 함수

pathname이 symbolic link된 파일이면 원본 파일을 check !

이 함수의 mode는 4가지가 있다

R_OK : 읽기 권한 확인
W_OK : 쓰기 권한 확인
X_OK : 실행 권한 확인
F_OK : 파일 존재 여부 확인

how에 check하고 싶은 권한을 넣어서 사용.
각 mode는 how라는 int 변수의 bit를 통해 옵션 여부를 저장하므로,
내가 원하는 옵션들을 | (bit 연산 OR) 연산하여 how자리에 넣어준다.

위 코드는 실행 권한만을 확인한 코드인데, 만약 이외에도 다른 권한을 확인하고 싶다면

access(temp_cmd, F_OK | R_OK | X_OK)

위와 같은 방식으로 사용하면 된다.

권한이 있다면 0을, 권한이 없다면 -1을 반환한다.

pipex 프로젝트에서는 입력으로 들어온 command가 실행 가능한지 여부를 check할 때 사용이 가능하다
각 command들도 결국은 실행 파일로서 존재하며, 이를 실행시킴으로써 처리가되는 것이기 때문에 어떤 PATH에 대해서도 실행시킬 수 있는 파일이 없는 command라면 존재하지 않는 command !

#include <unistd.h>

int unlink(const char *pathname)

filesystem에서 해당 파일을 delete
pathname에 해당하는 파일이 파일에 대한 last link이면서, 이 file을 open하고 있는 process가 없다면 file이 제거되고 남은 공간은 재사용이 가능해지도록 한다.

  • last link지만 open된 상태인 경우
    → close될 때까지 remain
  • symbolic link인 경우
    → link가 제거됨
  • socket, FIFO, device 등이면
    → 파일은 제거되나 process에서 open된 object이면 여전히 사용은 가능하다

함수가 성공적으로 종료되면 0을, 실패하면 -1을 반환한다.

pipex 프로젝트에서 위 함수는 사용하지 않았는데,
이 함수는 bonus에서 << (here_doc)을 구현할 때 사용하면 좋을 것 같다고 생각한다.
here_doc은 STDIN에서 받는 입력을 임시 파일로 받고 이를 open해서 다시 읽어들이는 방식으로 대부분 구현을 하는데, 이 때 생긴 임시 파일을 프로그램이 끝날 때 제거를 해주는 방식으로 사용하면 좋았을 것 같다.

📍dup, dup2

#include <unistd.h>

int dup(int fd)
int dup2(int fd1, int fd2)
  • dup
    현재 fd에 open한 파일에 대한 file descriptor를 반환
    이 때, 반환하는 file descriptor는 lowest numbered available descriptor이다.
    성공 시, file descriptor를 반환하고
    실패 시, errno setting과 함께 -1을 반환

  • dup2
    fd2가 fd1에 해당하는 파일을 가리키게 됨
    fd2가 기존에 가리키던 file은 close 된다.
    성공 시, fd2를 return하고
    실패 시, errno setting과 함께 -1을 반환

pipex에서 위와 같이 dup2를 사용해서 코드를 작성했다.
하나의 process는 실행될 때 기본적으로 STDIN으로 입력을 받고, STDOUT으로 출력을 하도록 세팅이 되어 있는데,
pipe를 통해 입력을 받고 출력을 할 수 있도록 해야하기 때문에
STDIN과 STDOUT이 적절하게 파이프의 READ, WRITE 포트를 가리킬 수 있도록 하는데 사용한다고 생각하면 좋을 것 같다!

과제평가를 진행하면서 조언 받은 부분

가장 끝단 process에서 마지막으로 STDIN_FILENO를 pipe의 read단으로 dup해주면, stdin이 결국 어떤 파이프의 read에서 계속 입력을 기다리도록 세팅된다.
이 때, 명령어를 모두 실행하고 프로그램이 종료될 때 STDIN이 실제 stdin이 아니라 어떤 pipe의 read단에서 읽기를 기다리고 있으므로 close(STDIN_FILENO)를 해주는 것이 바람직하다.
나중에 minishell 과제를 하게 되면 이를 close해주어야 다음 command-line을 입력받았을 때 정상적으로 STDIN을 사용할 수 있다 !


🦋 pipex repo address

https://github.com/kyj93790/42-cursus/tree/master/pipex

profile
The World Is My Oyster 🌏

0개의 댓글