System call

  • 400개의 서비스가 존재
  • 여기에 선언되어 있음

    1
    nano /usr/include/x86_64-linux-gnu/asm/unistd_64.h
    cs

 


man(메뉴얼)

  • ex) man 2 write : write라는 시스템 콜의 메뉴얼 2섹션을 봄

  • NAME : 커멘드 창에서 어떤식으로 사용해야 하는지
  • SYNOPSIS : 개요 - 선언
  • DESCRIPTION : 해당 시스템 콜 설명

  • RETURN VALUE : 리턴 값 -> 성공했으면 쓰인 바이트 수가 반환, -1이면 에러 발생
  • ERRORS : 어떤 에러가 발생할 수 있는지 에러들의 리스트
  • 위 두 가지는 시스템 콜 사용 시 매우 유심히 봐야하는 항목임

getpid()와 getppid()

  • getpid() : 함수를 호출한 프로세스의 ID리턴
  • getppid() : 부모 프로세스 ID를 리턴
  • 이러한 시스템 콜 함수들은 POSIX, 4.3BSD, SVr4. 등 서로 다른 여러 시스템에서도 돌아감
  • 간단한 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
#include <sys/types.h>
#include <unistd.h>
 
 
int main()
{
        pid_t mypid;
        pid_t myppid;
 
        mypid = getpid();
        myppid = getppid();
 
 
        printf("%d\n",(long) mypid);
        printf("%d\n",(long) myppid);
}
cs
  • 이러한 getp.c라는 파일을 생성
  • pid_t : 프로세스 ID의 번호 타입(컴퓨터마다 비트 타입이 다르기 때문에 다른 이름으로 선언, 보통 long type)
  • 생성한 파일을 gcc로 컴파일 해준 후 실행
1
gcc getp.c -o getp
cs

 

1
./getp
cs

 

- 실행할때마다 mypid값은 달라지고 myppid값은 고정되어 있는 것을 확인

 


strace

- 실행파일이 실행되면서 어떤 시스템콜을 불렀는지 알려줌

ex)

 

1
strace ./getp
cs

 

 

1
strace ls
cs

 


여러가지 systemcall들 확인

 

1
man syscalls
cs

 

 

- 시스템 콜들 리스트(여러 버전)

- 1.0 버전부터 3이상의 버전까지 존재

- 1.0이 가장 초기의 버전

 

이중에서 1.0버전부터 사용된 시스템 콜을 10가지정도 살펴보자

 

1.

 

Name : read - read from a file descriptor

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
#include <unistd.h>
 
ssize_t read(int fd, void *buf, size_t count);
cs

 

DESCRIPTION : read()는 파일 디스크립터 fd로부터 카운트 바이트까지 읽기를 시도한다.

buf에서 시작하는 버퍼에 저장한다.

 

Return value : 성공 시, 읽은 바이트 수가 반환됨(0은 끝을 나타냄).

파일의 위치는 이 바이트 수만큼 앞당겨짐

이 수치가 요구 된 바이트 수보다 작은 경우는 에러.

실제로 사용할 수 있는 바이트 수가 더 적기 때문에 이 문제가 발생할 수 있음

에러 시 1이 반환되고 errno가 적절하게 설정됨 -> 이 경우에 따라 파일 위치 변경

 

2.

 

Name : rename - change the name or location of a file

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
 
  
 
int rename(const char *oldpath, const char *newpath);
 
  
 
#include <fcntl.h> /* Definition of AT_* constants */
 
#include <stdio.h>
 
  
 
int renameat(int olddirfd, const char *oldpath,
 
int newdirfd, const char *newpath);
 
  
 
int renameat2(int olddirfd, const char *oldpath,
 
int newdirfd, const char *newpath, unsigned int flags);
 
  
 
Note: There is no glibc wrapper for renameat2(); see NOTES.
 
  
 
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
  
 
renameat():
 
Since glibc 2.10:
 
_POSIX_C_SOURCE >= 200809L
 
Before glibc 2.10:
 
_ATFILE_SOURCE
cs

 

DESCRIPTION : rename()은 파일의 이름을 변경하고 필요할 경우 디렉토리간에 파일을 이동

 

Return value : 성공하면 0이 반환, 에러시 1이 반환되고 errno가 적절하게 설정

 

3.

 

Name : mkdir - create a directory

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <sys/stat.h>
 
#include <sys/types.h>
 
  
 
int mkdir(const char *pathname, mode_t mode);
 
  
 
#include <fcntl.h> /* Definition of AT_* constants */
 
#include <sys/stat.h>
 
  
 
int mkdirat(int dirfd, const char *pathname, mode_t mode);
 
  
 
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
  
 
mkdirat():
 
Since glibc 2.10:
 
_POSIX_C_SOURCE >= 200809L
 
Before glibc 2.10:
 
_ATFILE_SOURCE
cs

 

DESCRIPTION : mkdir()pathname이라는 디렉토리를 생성하려고 시도

 

Return value : 성공 시 0을 반환, 오류일 경우 1을 반환(errno가 적절히 설정

 

4.

 

Name : write - write to a file descriptor

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
#include <unistd.h>
 
ssize_t write(int fd, const void *buf, size_t count);
cs
 

DESCRIPTION : write()buf에서 시작하는 버퍼에서 파일 디스크립터 fd가 가리키는 파일까지 최대 count바이트를 씀

 

Return value : 성공하면 기록 된 바이트 수가 반환(0은 아무것도 기록되지 않은 것)

에러시 1이 반환되고 errno가 적절하게 설정

 

5.

 

Name : link - make a new name for a file

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <unistd.h>
 
  
 
int link(const char *oldpath, const char *newpath);
 
  
 
#include <fcntl.h> /* Definition of AT_* constants */
 
#include <unistd.h>
 
  
 
int linkat(int olddirfd, const char *oldpath,
 
int newdirfd, const char *newpath, int flags);
 
  
 
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
  
 
linkat():
 
Since glibc 2.10:
 
_POSIX_C_SOURCE >= 200809L
 
Before glibc 2.10:
 
_ATFILE_SOURCE
cs

   

DESCRIPTION : link()는 기존 파일에 대한 새 링크(하드 링크라고도 함)를 만듦

 

Return value : 성공하면 0 반환, 에러시 1이 반환되고 errno가 적절하게 설정

 

6.

 

Name : kill - send signal to a process

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
8
9
#include <sys/types.h>
 
#include <signal.h>
 
int kill(pid_t pid, int sig);
 
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
kill(): _POSIX_C_SOURCE
cs

 

DESCRIPTION : kill() 시스템 콜은 모든 프로세스 그룹이나 프로세스에 신호를 보내는 데 사용

 

Return value : 성공하면 0이 리턴, 에러시 1이 반환되고 errno가 적절하게 설정

 

7.

 

Name : getpid - get process identification

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
#include <sys/types.h>
 
#include <unistd.h>
 
pid_t getpid(void);
 
pid_t getppid(void);
cs

 

DESCRIPTION : getpid()는 호출 프로세스의 프로세스 ID를 리턴

 

Return value : 호출 프로세스의 프로세스 ID

 

8.

 

Name : getppid - get process identification

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
#include <sys/types.h>
 
#include <unistd.h>
 
pid_t getpid(void);
 
pid_t getppid(void);
cs

 

DESCRIPTION : getppid()는 호출한 프로세스의 부모프로세스 ID를 반환

 

Return value : 프로세스의 부모프로세스 ID

 

9.

 

Name : execve - execute program

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
#include <unistd.h>
 
int execve(const char *filename, char *const argv[],
 
char *const envp[]);
cs

 

DESCRIPTION : execve()filename이 가리키는 프로그램을 실행

 

Return value : 성공시, execve()는 리턴하지 않음

에러발생시 1이 반환되고 errno가 적절하게 설정

 

10.

 

Name : exit - terminate the calling process

 

Synopsis(헤더파일 정보와 함수 프로토타입 정보)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <unistd.h>
 
void _exit(int status);
 
#include <stdlib.h>
 
void _Exit(int status);
 
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
 
_Exit():
 
_ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
cs

 

DESCRIPTION : 함수 exit()는 호출 프로세스를 즉시 종료함

 

Return value : 이 함수는 반환을 하지 않음

+ Recent posts