System call
- 400개의 서비스가 존재
-
여기에 선언되어 있음
1nano /usr/include/x86_64-linux-gnu/asm/unistd_64.hcs
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 |
- 시스템 콜들 리스트(여러 버전)
- 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 : 이 함수는 반환을 하지 않음
'LINUX 실습' 카테고리의 다른 글
[시스템 콜 파일(2)]myls, mycp2 함수 만들기 (0) | 2018.11.18 |
---|---|
[File I/O]시스템 콜을 이용하여 함수 만들기 (0) | 2018.11.12 |
[Git실습]Git사용법 부터 간단한 작성,수정,저장 (0) | 2018.10.17 |
[make 실습]기능별로 디렉토리를 나누어 make file 호출 (0) | 2018.10.07 |
[gcc]정적(static)라이브러리와 공유(shared)라이브러리 (0) | 2018.09.22 |