이 Linuxhint 기사에서는 시스템 호출이 무엇인지, 어떤 용도로 사용되는지, 표준 C 라이브러리의 다른 기능과 다른 점은 무엇인지 설명합니다. 또한 시스템에서 커널에 어떤 기능을 제공하고 프로세스가 제공하는 서비스를 어떻게 사용하는지 보여줍니다. 또한 각 함수에 대한 간략한 설명과 해당 함수가 선언된 헤더와 함께 가장 일반적으로 사용되는 시스템 호출 목록을 보여줍니다. 다른 섹션에서는 명령 콘솔을 통해 시스템 호출 작동을 모니터링하는 방법을 보여 드리겠습니다.
개념적으로 모든 시스템은 각각 고유한 기능과 권한을 갖는 계층으로 구성됩니다. 시스템을 구성하는 이 계층 스택은 하드웨어 구성 요소가 포함된 가장 낮은 수준에서 시작하여 사용자 모드라고 알려진 최상위 계층에서 끝납니다.
우리가 컴퓨터에서 실행하는 모든 프로그램과 모든 코드는 시스템의 사용자 모드에서 실행되는 프로세스에서 결과를 작성하고 컴파일합니다. 이 모드에서 사용자는 일상적인 작업을 수행하고, 다양한 애플리케이션을 실행 및 사용하고, 파일을 관리하는 등의 작업을 수행합니다. 보안 수준에서 이는 시스템의 가장 피상적인 계층이므로 가장 제한적이며 기본적으로 시스템 리소스를 직접 관리하고 사용하도록 완전히 제한됩니다.
앞서 언급했듯이 하드웨어 계층은 시스템의 가장 낮은 수준입니다. 바로 위에는 Linux 커널이 있습니다. 커널은 하드웨어와 통합되어 하드웨어를 엄격하게 관리하는 운영 체제의 핵심으로, 그렇게 할 수 있는 권한을 가진 유일한 커널입니다. 예를 들어 프로세스와 메모리는 여기에서 관리되고, 데이터는 하드 디스크나 SSD에서 액세스되며, 네트워크 장치는 제어됩니다. OS와 프로세스가 하드웨어와 관련된 모든 작업은 커널을 통해 수행됩니다. 따라서 소프트웨어와 하드웨어를 통합한 일종의 펌웨어라고 할 수 있다.
운영 체제가 사용자 모드에 부과하는 리소스 액세스 및 관리에 대한 제한을 고려하고 이러한 리소스에 대한 액세스는 커널을 통해서만 가능하므로 프로세스가 작동하는 데 필요한 리소스와 상호 작용할 수 있도록 하는 메커니즘이 필수적입니다.
시스템 호출 또는 SysCall은 사용자 프로세스와 커널 간의 인터페이스 역할을 하는 운영 체제에서 제공하는 함수 집합입니다. 이러한 기능을 통해 우리는 OS와 상호 작용하고 이를 통해 시스템 리소스를 사용해야 하는 서비스를 요청할 수 있습니다. syscall은 리소스나 해당 관리에 대한 직접적인 액세스 권한을 부여하지 않지만 커널은 이를 관리하고 이를 호출하는 프로세스에서 사용할 수 있도록 하지만 항상 엄격한 관리를 받습니다.
실제로 시스템 호출 함수는 일반 함수처럼 보이고 그런 방식으로 구현됩니다. 여기에는 처리할 데이터가 전송되는 입력 인수와 운영 체제가 결과를 반환하는 출력 인수가 있습니다.
이 유형의 함수를 호출하는 방법은 C 라이브러리에서 찾을 수 있는 다른 함수와 동일합니다. 따라서 호출 함수인지 아닌지에 대한 질문은 실제로 프로그래머에게는 순전히 개념적인 질문입니다.
이러한 함수의 인수는 C 언어의 표준 유형을 사용합니다. 그러나 작업 특성상 일반적으로 메모리 주소, 설명자, 경로 등을 저장하는 포인터입니다.
Linux에는 현재 약 350개의 시스템 호출이 있습니다. 또한 코드에서 syscall을 사용하여 메모리를 동적으로 관리하는 malloc(), free(), calloc(), realloc() 함수 등 시스템 호출이 아니지만 이를 통해 리소스를 관리하는 함수가 많이 있습니다.
Linux 콘솔에서 Strace 명령을 사용하여 시스템 호출을 모니터링하는 방법
이제 시스템 호출 기능이 무엇인지 알았으니 "strace" 명령을 사용하여 Linux 명령 콘솔에서 시스템 호출 기능을 실시간으로 모니터링하는 방법을 보여드리겠습니다. "strace" 명령은 매우 유연합니다. 시스템을 모니터링하는 데 사용되며 다음 명령으로 볼 수 있는 여러 옵션을 제공합니다:
이 명령을 실행하면 "strace"가 제공하는 모니터링 옵션 목록이 명령 콘솔에 표시됩니다.

프로세스의 syscall을 모니터링하려면 다음 명령을 사용하여 실행해야 합니다:
스트랙
추적 ./프로세스
전자 -h
이를 테스트하기 위해 "C 언어의 연결 함수"라는 제목의 기사에서 예제로 제공한 다음 코드를 컴파일합니다. 이 코드는 매우 간단하지만 HTTP 서비스를 통해 Google 호스트에 연결하고 명령을 보내고 응답을 받을 수 있다는 점에서 매우 흥미롭습니다.
#include
#include <문자열.h>
#include
#include
#include
#include
#include
#include
int 메인(){
//1단계
int 소켓_ID;
int 포트 =80;
정수 오류;
문자 버퍼 [1025];
구조체 호스트 *서버;
구조체 sockaddr_in 클라이언트;
memset(&server, 0, sizeof(서버));
//2단계
서버 =gethostbyname ( "www.google.com" );
if(서버 ==NULL)
{
printf("\n도메인 데이터를 가져오는 중 오류가 발생했습니다.\n");
1을 반환합니다.
}
//3단계
소켓_ID =소켓( AF_INET, SOCK_STREAM, 0 );
//4단계
client.sin_family =AF_INET;
client.sin_port =htons(포트);
//5단계
bcopy((char *) 서버->h_addr,
(문자 *) &client.sin_addr.s_addr,
sizeof(서버->h_length));
error=connect(socket_id, (struct sockaddr *) &client, sizeof(client));
만약 (오류 <0){
printf("\n서버에 연결할 수 없습니다\n");
닫기(socket_id);
1을 반환합니다.
}
printf("\n연결 대상:%s\n", inet_ntoa( client.sin_addr ));
동안 (1){
printf("종료하려면 Ctrl+c를 누르세요. \nhttp 명령 보내기:");
fgets(버퍼, 1025, 표준입력);
send(socket_id, 버퍼, 1025, 0);
memset(&buffer, '\0', 1025);
recv(socket_id, 버퍼, 1025, 0);
printf("%s", 버퍼);
memset(&buffer, '\0', 1025);
}
}
코드를 컴파일하고 "connect" 출력 이름을 지정합니다. 그런 다음 "./connect" 명령을 사용하여 실행하고 "strace" 명령을 추가하여 syscall을 모니터링할 수 있습니다.
이 명령은 명령 콘솔에 있는 프로세스의 syscall을 표시합니다. 다음 그림에서 볼 수 있듯이, 우리 코드에서는 오직 소켓(), 연결(), send() 및 Recv() 시스템 호출만 사용했지만, 이를 실행하려면 우리가 사용하는 함수의 코드에서 발생하는 다른 시스템 호출이 필요합니다.

다음 명령은 프로세스가 종료될 때 프로세스에 대한 시스템 호출 요약을 표시합니다.

프로세스 관리를 위한 시스템 호출 기능:
execlp()
실행()
execv()
execvp()
execvpe()
상위 프로세스로부터 PID 및 리소스를 상속하여 한 프로세스를 다른 프로세스로 대체하는 시스템 함수 호출 계열.unistd.hfork()프로세스를 복제합니다.unistd.hgetpid()호출 프로세스의 PID를 가져옵니다.unistd.hgetppid()호출 프로세스의 상위 프로세스의 PID를 가져옵니다.unistd.hexit()프로세스의 종료 상태를 보고합니다.stdlib.hgetcwd()getwd()
호출 프로세스의 현재 작업 디렉터리가 포함된 문자열을 반환합니다.unistd.hpause()신호가 도착할 때까지 프로세스를 일시 중지합니다.unistd.hwait()상위 프로세스에서 하위 프로세스의 출력을 기다립니다.wait.h파일 관리를 위한 시스템 호출 기능:
기능 설명 헤더 열다()열기()
파일 열기.fcntl.hclose()파일 닫기.unistd.hread()파일 읽기.unistd.hpoll()특정 작업에 대한 파일의 가용성을 폴링합니다.poll.hwrite()파일 쓰기.unistd.hfcntl()파일 설명자를 조작합니다.fcntl.htruncate()ftruncate()
파일을 지정된 길이로 자릅니다.unistd.hcreat()파일 생성.fcntl.hchmod()fchmod()
filesys/stat.hunlink의 권한을 설정합니다.()file.unistd.h를 삭제합니다.신호 처리를 위한 시스템 호출 기능:
기능 설명 signal()신호를 핸들러와 연결합니다.signal.hkill()프로세스로 신호 보내기.signal.hkillpg()프로세스 그룹으로 신호 보내기.signal.hraise()호출하는 프로세스에서 신호 작업을 수행합니다.signal.hsigaction()신호의 작업을 설정합니다.signal.hsigwait()지정된 신호가 나올 때까지 호출 스레드의 실행을 일시 중지합니다. arrivals.signal.hsighold()호출 프로세스의 신호에 신호를 추가합니다.psiginfo()
signal.signal.h에 대한 설명과 함께 메시지를 인쇄합니다.소켓 처리를 위한 시스템 호출 함수:
기능 설명 소켓()소켓.socket.hbind 만들기()소켓에 이름 바인딩socket.hconnect()소켓.socket.hlisten 연결()소켓.socket.haccept에서 연결 수신()소켓.socket.hrecv()에서 연결 수락Recvfrom()
Recvmsg()
Socket.socket.hsend()로부터 메시지를 받습니다.sendto()
sendmsg()
소켓.socket.hgetsockname()에서 메시지 보내기 descriptor.socket.hgetsockopt()를 통해 특정 소켓의 주소를 반환합니다. 소켓.socket.h에 대한 옵션을 설정하거나 가져옵니다.결론
이 Linuxhint 기사에서는 시스템 호출 기능이 무엇인지, 시스템 리소스 사용과 관련된 커널 서비스를 요청하는 데 시스템 호출 기능이 어떻게 사용되는지 설명했습니다. 사용자 프로세스가 무엇인지, 그리고 시스템 호출을 통해 커널과 상호 작용하는 방법에 대해 간략하게 설명했습니다.
이러한 기능을 빠르게 실행하는 데 도움이 되도록 가장 일반적으로 사용되는 시스템 호출 목록과 간단한 설명, 해당 기능을 사용하기 위해 코드에 포함해야 하는 헤더가 포함되어 있습니다. 또한 명령 콘솔을 통해 프로세스의 시스템 호출을 모니터링하는 방법을 보여주는 섹션도 포함했습니다.