#include <unistd.h>

  • read
    • ssize_t read(int fd, void *buf, size_t size); fd 에서 size 만큼의 값을 읽어 buf에 담아준다.
  • write
    • ssize_t write(int fd, const void *buf, size_t count); 해당 fd에 size 만큼의 buf를 써준다.
  • access
    • int access(const char *pathname, int mode); int mode 종류 R_OK : 파일 존재 여부, 읽기 권한 여부 W_OK : 파일 존재 여부, 쓰기 권한 여부 X_OK : 파일 존재 여부, 실행 권한 여부 F_OK : 파일 존재 여부
      예제
      int main(void) { char *pathname = "./hello.txt"; int mode = R_OK | W_OK; // 비트 연산으로 여러가지를 한번에 체크 가능하다. if( access( pathname, mode ) == 0 ) { printf("읽고 쓸 수 있습니다."); } else{ printf("권한이 없거나 존재하지 않습니다."); } }
  • dup
    • int dup(int fd); dup는 fd로 전달받은 파일 서술자를 복제하여 반환한다. dup가 돌려주는 파일 서술자는 가장 낮은 서술자를 반환한다. 성공시 새 파일 서술자, 오류시 -1을 반환한다.
  • dup2
    • int dup2(int fd, int fd2); dup2는 새 서술자의 값을 fd2로 지정한다. 만일 fd2가 이미 열려있으면 fd2를 닫은 후 복제가 된다. 역시 성공시 새 파일 서술자, 오류시 -1을 반환한다.
  • execve
    • int execve(const char *filename, char *const argv[], char *const envp[]); execve 는 다른 실행 파일을 실행 시키는 함수라 생각하면 된다.
  • fork
    • pid_t fork(void); 현재 실행되는 프로세스에 대해 복사본 프로세스를 생성합니다. fork함수를 호출하는 프로세스가 부모 프로세스가 되고, 새롭게 생성되는 프로세스가 자식 프로세스가 된다. 자식 프로세스는 부모 프로세스의 메모리를 그대로 복사하여 가지게 된다. 그리고 fork함수 호출 이후 코드부터는 각자의 메모리를 사용하여 실행 된다. (반환값) 성공시 : 부모 프로세스에서는 자식 프로세스의 PID값을 반환 받음, 자식 프로세스에서는 0 값을 반환 받음. 실패시 : 음수 값 -1 반환
  • pipe
    • int pipe(int fd[2]); 파이프(Pipe)란 프로세스간 통신을 할때 사용하는 커뮤니케이션의 한 방법입니다. 가장 오래된 UNIX 시스템의 IPC로 모든 유닉스 시스템이 제공합니다. 하지만 두가지 정도의 한계점이 있습니다. 첫번째 한계점으로 파이프는 기본적으로 반이중 방식입니다. 물론 전이중 방식을 지원하는 시스템이 있긴 하나, 최대의 이식성을 위해서는 파이프는 반이중 방식이라는 생각을 해야합니다. 이것은 FIFO라는 명명된 파이프로 극복할 수 있습니다. 두번째 한계점으로는 부모, 자식 관계에서의 프로세스들만 사용할 수 있습니다. 부모프로세스가 파이프를 생성하고, 이후 자식 프로세스와 부모프로세스가 파이프를 이용하여 통신합니다. 이러한 한계점이 잇긴 하지만 여전히 쓸모있는 IPC기법입니다. (RETURN) 성공 : 0 실패 : -1
  • unlink
    • int unlink(const char *pathname); 파일을 삭제하는 system call 함수입니다. 정확하게는 unlink는 hard link의 이름을 삭제하고 hard link가 참조하는 count를 1감소시킵니다. hard link의 참조 count가 0이 되면, 실제 파일의 내용이 저장되어 있는 disk space를 free하여 OS가 다른 파일을 위해서 사용할 수 있도록 합니다. 따라서 hard link를 생성하지 않은 파일은 바로 disk space를 해제하여 사실상 파일 삭제합니다.
  • getcwd
    • char *getcwd(char *buf, size_t size); 현재 작업 디렉토리의 full path명을 null-terminated 문자열로 얻는다. 현재 작업 디렉토리를 저장할 buf의 크기(size)가 작으면 NULL을 return하며, errno에 ERANGE가 설정된다. 만약 buf를 NULL로 설정하면 malloc(3)을 통해서 할당된 메모리에 작업디렉토리를 저장하여 return한다. 따라서 free(3)를 호출하여 메모리 해제를 해줘야 한다.
  • isatty
    • int isatty(int fd); fd가 터미널에 연결되어 있는지 확인한다. (RETURN) 연결되어있으면 : 1 안돼있으면 : 0
  • ttyname
    • char *ttyname(int fd); fd에 대한 터미널 이름을 가져온다. 일반적으로 자신의 터미널 이름을 가져오는데 사용되므로 프로세스가 만들어질 때 기본적으로 생성되는 fd(0,1,2) 에 대해 적용되는 경우가 많다. (RETURN) 성공 : 터미널 장치명에 대한 포인터 실패 : NULL (ERROR) EBADF : 잘못된 파일 지정자 ENOTTY : 파일 지정자가 터미널을 가지고 있지 않다.
  • ttyslot
    • int ttyslot(void); /etc/ttys파일에 있는 항목 중 호출 프로세스에서 사용중인 터미널의 인덱스를 반환하며 일반적으로 이 값은 /etc/파일에 있는 현재 사용자에 대한 항목의 인덱스와 동일하다. (RETURN) 성공 : 사용중인 터미널의 인덱스 실패 : 0
  • usleep
    • void sleep( unsigned long useconds) unsigned long useconds 대기 마이크로 초만큼 대기한다.