기술나눔

높은 동시성 리액터 서버 [중간]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

4. 프로세스 제어 및 프로세스 동기화

1. 신호

1.1 신호의 기본 개념

시그널(signal)은 프로세스 간에 메시지를 전송하는 방법으로, 이벤트가 발생했음을 프로세스에 알리는 데 사용되지만 프로세스에 어떤 데이터도 전달할 수 없습니다.

신호가 생성되는 데에는 여러 가지 이유가 있습니다. 셸에서 다음을 사용할 수 있습니다.kill그리고killall신호를 보내는 명령:

kill -信号的类型 进程编号
killall -信号的类型 进程名
  • 1
  • 2

1.2 신호 유형

신호 이름신호값기본 처리 작업신호를 보내는 이유
시그업1터미널이 정지되거나 제어 프로세스가 종료됩니다.
신호2키보드 인터럽트 Ctrl+c
시그킷3키보드의 Esc 키를 눌렀습니다.
시질4불법적인 지시
시그트랩5중단점 지침
시가브르트6abort(3)에 의해 발행된 중단 신호
시그버스7버스 오류
시그페8부동 소수점 예외
시그킬9kill -9는 프로세스를 종료합니다. 이 신호는 포착되거나 무시될 수 없습니다.
시구스알110사용자 정의 신호 1
시그세그브11잘못된 메모리 참조(배열이 범위를 벗어남, 널 포인터 작업)
시구스르212사용자 정의 신호 2
시그파이프13읽기 프로세스 없이 파이프에 데이터 쓰기
시갈름14알람시계 신호, Alarm() 함수가 보내는 신호
시그텀15종료 신호, 기본적으로 전송되는 신호
신호음16스택 오류
시그클드17자식 프로세스가 종료될 때 발생
시그콘트18중지된 프로세스 재개
신호 정지19프로세스 중지
SIGTSTP20터미널 프레스 정지 키
시그틴21터미널 읽기를 위한 백그라운드 프로세스 요청
시그투22백그라운드 프로세스가 터미널에 쓰기를 요청합니다.
시구르그23비상상황 감지(소켓)
시그마XCPU24CPU 시간 제한을 초과했습니다.
시그XFSZ25파일 크기 제한을 초과했습니다.
신호 탈 RM26가상 클록 신호
시그프로프27클록 신호 분석
시그윈치28창 크기 변경
시그폴29폴링(Sys V)
뉴스30정전
시그시스31불법적인 시스템 호출

A의 기본 작업은 프로세스를 종료하는 것입니다.

B의 기본 동작은 이 신호를 무시하는 것입니다.

C의 기본 동작은 프로세스를 종료하고 커널 이미지 덤프를 가져오는 것입니다.

D의 기본 동작은 프로세스를 중지하는 것이며, 중지된 상태에 들어간 프로그램은 계속해서 실행될 수 있습니다.

1.3 신호 처리

프로세스가 신호를 처리하는 방법에는 세 가지가 있습니다.

  1. 시스템의 기본 작업은 이 신호를 처리하는 데 사용됩니다. 대부분의 신호의 기본 작업은 프로세스를 종료하는 것입니다.
  2. 인터럽트 처리 기능을 설정하면 신호를 수신한 후 해당 기능이 처리됩니다.
  3. 신호를 무시하고 마치 아무 일도 일어나지 않은 것처럼 신호에 대해 아무 작업도 수행하지 않습니다.

signal()함수는 프로그램이 신호를 처리하는 방법을 설정할 수 있습니다.

함수 선언:

#include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • 1
  • 2
  • 3
  • 4

매개변수 설명:

  • sig:캡처할 신호를 지정합니다.
  • func : 신호 처리 함수에 대한 포인터입니다. 처리 기능은 캡처된 신호 번호인 정수 매개변수를 수신해야 합니다.
  1. SIG_DFL :SIG_DFL 매크로는 기본 신호 처리 방법을 나타냅니다.사용SIG_DFL~처럼signal함수의 두 번째 매개변수는 시스템 기본 처리 방법이 신호에 사용됨을 나타냅니다.
  2. SIG_IGN :SIG_IGN 매크로는 신호를 무시한다는 의미입니다.사용SIG_IGN~처럼signal 함수의 두 번째 매개변수는 프로세스가 신호를 수신하면 이를 무시하고 어떤 처리도 수행하지 않음을 나타냅니다. 이를 통해 특정 상황에서 프로세스가 예기치 않게 종료되거나 중단되는 것을 방지할 수 있습니다.
  3. SIG_ERR:SIG_ERR 매크로는 오류를 나타내는 데 사용됩니다.그것은 그렇지 않다signal대신 함수의 두 번째 매개변수가 다음과 같이 사용됩니다.signal 함수의 반환 값은 호출이 실패했음을 나타냅니다.만약에signal함수 호출이 실패하면 반환됩니다.SIG_ERR .이는 일반적으로 감지하고 처리하는 데 사용됩니다.signal함수 호출 중 오류가 발생했습니다.

이미지-20240709113614147

이미지-20240709113230874

이미지-20240709113240944

1.4 신호의 용도는 무엇입니까?

서비스 프로그램은 백그라운드에서 실행되는데, 프로세스를 종료하면 갑자기 종료되고 후속 작업이 준비되지 않으므로 종료하는 것은 좋은 생각이 아닙니다.

서비스 프로그램에 신호를 보내면 신호를 받은 후 서비스 프로그램이 함수를 호출하고 그 함수에 여파 코드를 쓰면 프로그램이 계획된 방식으로 종료될 수 있습니다.

서비스 프로그램에 0의 신호를 보내면 프로그램이 살아 있는지 여부를 감지할 수 있습니다.

이미지-20240709135336848

1.5 신호 보내기

Linux 운영 체제는 다음을 제공합니다. kill 그리고killall 이 명령은 프로그램에 신호를 보냅니다.kill() 라이브러리 함수는 다른 프로세스에 신호를 보냅니다.

함수 선언:

int kill(pid_t pid, int sig);
  • 1

kill() 이 함수는 매개변수를 사용합니다.sig 지정된 신호가 매개변수로 전달됩니다.pid 지정된 프로세스.

매개변수 pid 몇 가지 상황이 있습니다:

  1. pid > 0 다음과 같이 신호를 프로세스에 전달합니다.pid 프로세스.
  2. pid = 0 현재 프로세스와 동일한 프로세스 그룹에 있는 모든 프로세스에 신호를 전달합니다. 이 동작은 시스템 구현에 따라 부모 프로세스에서 신호를 보내는 데 자주 사용됩니다.
  3. pid < -1 프로세스 그룹 ID에 신호를 전달합니다.|pid| 모든 프로세스의.
  4. pid = -1 신호를 보낼 권한이 있는 모든 프로세스에 신호를 전달하지만 신호를 보낸 프로세스에는 전달하지 않습니다.

2. 처리 종료

프로세스를 종료하는 방법에는 8가지가 있으며 그 중 5가지가 일반 종료입니다.

  1. 존재하다 main() 기능의 경우return 반품;
  2. 어떤 함수에서든 호출됨 exit() 기능;
  3. 어떤 함수에서든 호출됨 _exit() 또는_Exit() 기능;
  4. 마지막 스레드는 시작 루틴(스레드 기본 기능)에서 시작됩니다. return 반품;
  5. 마지막 스레드에서 호출됨 pthread_exit() 반품;

비정상적으로 종료하는 방법에는 세 가지가 있습니다.

  1. 옮기다 abort() 기능 중단;
  2. 신호가 수신되었습니다.
  3. 마지막 스레드는 취소 요청에 응답합니다.

2.1 처리종료 현황

존재하다 main() 기능에서는return 반환된 값은 종료 상태입니다. 그렇지 않은 경우에는 종료 상태입니다.return 진술이나 전화exit()이면 프로세스의 종료 상태는 0입니다.

셸에서 프로세스 종료 상태를 확인합니다.

echo $?
  • 1

프로세스를 정상적으로 종료하는 3가지 기능(exit() 그리고_Exit() ISO C에 의해 지정됩니다._exit() POSIX에 의해 지정됨):

void exit(int status);
void _exit(int status);
void _Exit(int status);
  • 1
  • 2
  • 3

status 프로세스 종료 상태입니다.

이미지-20240709143530327

이미지-20240709143615950

2.2 리소스 출시 문제

  • return 함수가 반환될 때 로컬 개체의 소멸자가 호출됨을 나타냅니다.main() 기능상return 전역 개체의 소멸자도 호출됩니다.
  • exit() 프로세스를 종료함을 나타내며 로컬 개체의 소멸자는 호출되지 않고 전역 개체의 소멸자만 호출됩니다.
  • _exit() 그리고_Exit() 직접 종료하면 정리 작업이 수행되지 않습니다.

2.3 프로세스 종료 기능

프로세스를 사용할 수 있습니다. atexit() 기능 등록은 기능(최대 32개)을 종료하며, 이러한 기능은exit() 자동으로 호출됩니다.

int atexit(void (*function)(void));
  • 1

exit() 종료 함수가 호출되는 순서는 등록 시점과 반대입니다.

이미지-20240709143824286

이미지-20240709143830549

3. 실행 가능한 프로그램 호출

3.1 system() 함수

system()이 함수는 프로그램을 실행하는 간단한 방법을 제공하여 실행해야 하는 프로그램과 매개변수를 문자열로 전달합니다.system()그냥 기능하세요.

함수 선언:

int system(const char * string);
  • 1

system()함수의 반환값이 더 까다롭습니다.

  1. 실행된 프로그램이 존재하지 않는 경우system()이 함수는 0이 아닌 값을 반환합니다.
  2. 프로그램의 실행이 성공하고, 실행된 프로그램의 실행 상태가 0인 경우,system()이 함수는 0을 반환합니다.
  3. 프로그램의 실행이 성공하고 실행된 프로그램의 종료 상태가 0이 아닌 경우,system()이 함수는 0이 아닌 값을 반환합니다.

3.2 실행 함수 계열

exec함수 계열은 프로세스 내에서 프로그램(바이너리 또는 셸 스크립트)을 호출하는 또 다른 방법을 제공합니다.

exec함수 계열은 다음과 같이 선언됩니다.

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

알아채다

  1. 프로그램 실행이 실패하면 -1이 직접 반환되고 실패 이유가 저장됩니다.errno가운데.
  2. 새 프로세스의 프로세스 번호는 원래 프로세스의 프로세스 번호와 동일하지만 새 프로세스는 원래 프로세스의 코드 세그먼트, 데이터 세그먼트 및 스택을 대체합니다.
  3. 실행이 성공하면 주 프로그램에서 성공적으로 호출되면 함수가 반환되지 않습니다.exec그 후에는 호출된 프로그램이 호출 프로그램을 대체합니다. 즉,exec함수 이후의 코드는 실행되지 않습니다.
  4. 실제 개발에서 가장 일반적으로 사용되는 것은execl()그리고execv(), 다른 것들은 거의 사용되지 않습니다.

4. 프로세스 생성

4.1 리눅스 프로세스 0, 1, 2

전체 Linux 시스템의 모든 프로세스는 트리 구조로 되어 있습니다.

  • **0번 프로세스(시스템 프로세스)**는 모든 프로세스의 조상인 1번과 2번 프로세스를 생성한 것입니다.
  • **프로세스 번호 1(systemd)**은 커널 초기화 및 시스템 구성을 수행합니다.
  • **프로세스 2번(kthreadd)**은 모든 커널 스레드의 스케줄링 및 관리를 담당합니다.

사용pstree다음 명령을 사용하여 프로세스 트리를 볼 수 있습니다.

pstree -p 进程编号
  • 1

4.2 프로세스 식별

각 프로세스에는 음수가 아닌 정수로 표시되는 고유한 프로세스 ID가 있습니다. 고유하지만 프로세스 ID는 재사용이 가능합니다. 프로세스가 종료되면 해당 프로세스 ID가 재사용 후보가 됩니다. Linux에서는 새로 생성된 프로세스의 ID가 최근 종료된 프로세스에서 사용된 ID와 다르기 때문에 지연 재사용 알고리즘을 사용합니다. 이는 새로운 프로세스가 동일한 ID를 사용하는 종료된 프로세스로 오인되는 것을 방지합니다.

프로세스 ID를 가져오는 함수:

pid_t getpid(void);    // 获取当前进程的ID。
pid_t getppid(void);   // 获取父进程的ID。
  • 1
  • 2

4.3 포크() 함수

기존 프로세스에서 호출할 수 있음fork()함수는 새로운 프로세스를 생성합니다.

함수 선언:

pid_t fork(void);
  • 1

의지하다fork()생성된 새 프로세스를 하위 프로세스라고 합니다.

fork() 함수는 한 번 호출되지만 두 번 반환됩니다. 두 반환의 차이점은 자식 프로세스의 반환 값은 0이고, 부모 프로세스의 반환 값은 새로 생성된 자식 프로세스의 프로세스 ID라는 점입니다.

하위 프로세스와 상위 프로세스가 계속 실행됩니다.fork()그 이후의 코드는, 하위 프로세스는 상위 프로세스의 복사본입니다. 하위 프로세스에는 상위 프로세스의 데이터 공간, 힙 및 스택의 복사본이 있습니다(참고: 하위 프로세스는 상위 프로세스와 공유되지 않고 복사본을 소유합니다).

fork()그 이후에는 상위 프로세스와 하위 프로세스의 실행 순서가 정의되지 않습니다.

이미지-20240709221535371

이미지-20240709221546617

4.4 fork()의 두 가지 용도

  1. 상위 프로세스는 자신을 복사하려고 하며 상위 프로세스와 하위 프로세스는 각각 다른 코드를 실행합니다.이러한 사용법은 네트워크 서비스 프로그램에서 매우 일반적입니다. 부모 프로세스는 클라이언트의 연결 요청을 기다립니다. 요청이 도착하면 부모 프로세스가 호출합니다.fork(), 상위 프로세스가 다음 연결 요청을 계속 기다리는 동안 하위 프로세스가 이러한 요청을 처리하도록 합니다.
  2. 프로세스가 다른 프로그램을 실행하려고 합니다.이 사용법은 쉘에서 매우 일반적이며 하위 프로세스는 다음에서 시작됩니다.fork()귀국 후 바로 전화exec

4.5 공유 파일

fork()한 가지 기능은 상위 프로세스에서 열린 파일 설명자가 하위 프로세스에 복사되고 상위 프로세스와 하위 프로세스가 동일한 파일 오프셋을 공유한다는 것입니다.

상위 프로세스와 하위 프로세스가 동기화 없이 동일한 설명자가 가리키는 파일에 쓰는 경우 출력이 서로 혼합될 수 있습니다.

이미지-20240709222929369

이미지-20240709222803641

이 시점에서는 데이터 행이 100,000개만 있음을 알 수 있습니다.

이미지-20240709222853769

이미지-20240709223236254

이때 데이터 행은 200,000개가 되어야 합니다. 파일 쓰기 작업이 원자적이지 않기 때문에 행이 하나 줄어들 수 있습니다. 동기화 메커니즘이 없으면 두 프로세스가 동시에 파일의 다른 부분을 쓰려고 시도할 수 있습니다. 쓰기가 실패합니다. 데이터가 서로 간섭합니다.

4.6 vfork() 함수

vfork()함수 호출 및 반환 값은 다음과 같습니다.fork()동일하지만 의미가 다릅니다.

vfork()이 기능은 목적이 다음과 같은 새로운 프로세스를 생성하는 데 사용됩니다.exec자식 프로세스가 즉시 호출하기 때문에 부모 프로세스의 주소 공간을 복사하지 않는 새로운 프로그램exec , 따라서 상위 프로세스의 주소 공간은 사용되지 않습니다. 하위 프로세스가 상위 프로세스의 주소 공간을 사용하는 경우 알 수 없는 결과가 발생할 수 있습니다.

vfork()그리고fork()또 다른 차이점은 다음과 같습니다.vfork()하위 프로세스가 먼저 실행되고 하위 프로세스에서 호출되는지 확인하세요.exec또는exit그런 다음 상위 프로세스가 작업을 재개합니다.

5. 좀비 프로세스

운영 체제에서 좀비 프로세스는 종료되었지만 상위 프로세스가 아직 종료 상태를 읽지 않은 하위 프로세스를 의미합니다. 좀비 프로세스는 더 이상 실행되지 않지만 부모 프로세스가 이 정보를 읽을 때까지 커널이 프로세스의 종료 상태 정보(예: 프로세스 ID, 종료 상태 등)를 저장할 수 있도록 여전히 프로세스 테이블의 항목을 차지합니다.

5.1 좀비 프로세스의 원인

상위 프로세스가 하위 프로세스보다 먼저 종료되면 하위 프로세스는 프로세스 1에 의해 호스팅됩니다(이는 프로세스가 백그라운드에서 실행되도록 하는 방법이기도 합니다).

자식 프로세스가 부모 프로세스보다 먼저 종료되고 부모 프로세스가 자식 프로세스의 종료 정보를 처리하지 않으면 자식 프로세스는 좀비 프로세스가 됩니다.

5.2 좀비 프로세스의 피해

커널은 프로세스 번호, 종료 상태, 사용된 CPU 시간 등을 포함하여 각 하위 프로세스에 대한 데이터 구조를 유지합니다. 상위 프로세스가 하위 프로세스의 종료 정보를 처리하면 커널은 이 데이터 구조를 해제합니다. 상위 프로세스가 하위 프로세스의 종료 정보를 처리하지 않으면 커널은 이 데이터 구조를 해제하지 않으며 하위 프로세스의 프로세스 번호는 항상 점유됩니다. 시스템에서 사용할 수 있는 프로세스 수는 제한되어 있습니다. 좀비 프로세스가 많이 생성되면 사용 가능한 프로세스 수가 없기 때문에 시스템에서 새 프로세스를 생성할 수 없습니다.

5.3 좀비 프로세스를 방지하는 방법

  1. SIGCHLD 신호 처리 : 하위 프로세스가 종료되면 커널은 SIGCHLD 신호를 상위 프로세스로 보냅니다.상위 프로세스가 사용하는 경우signal(SIGCHLD, SIG_IGN)자식 프로세스의 종료에 관심이 없으며 해당 데이터 구조는 자식 프로세스가 종료된 후 즉시 해제될 것임을 커널에 알립니다.
  2. 사용wait()/waitpid()기능: 상위 프로세스는 이러한 함수를 호출하여 하위 프로세스가 종료되기를 기다리고 종료 상태를 획득하여 하위 프로세스가 점유한 자원을 해제합니다.
pid_t wait(int *stat_loc); 
pid_t waitpid(pid_t pid, int *stat_loc, int options); 
pid_t wait3(int *status, int options, struct rusage *rusage); 
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
  • 1
  • 2
  • 3
  • 4

반환 값은 하위 프로세스의 번호입니다.

stat_loc 하위 프로세스 종료에 대한 정보는 다음과 같습니다.

a) 정상적으로 종료되면 매크로는 WIFEXITED(stat_loc) True, 매크로를 반환합니다.WEXITSTATUS(stat_loc) 종료 상태를 확인할 수 있습니다.

b) 비정상적으로 종료되면 매크로는 WTERMSIG(stat_loc) 프로세스를 종료하라는 신호를 받습니다.

이미지-20240709230911352

이미지-20240709231034423

이미지-20240709231050581

이미지-20240709231124375

이미지-20240709231140813

상위 프로세스가 바쁜 경우 캡처할 수 있습니다. SIGCHLD 신호 처리 함수에서 호출되는 신호wait()/waitpid()

이미지-20240709231439475

이미지-20240709231422927

6.다중 프로세스 및 신호

[프로세스 간 신호 보내기](##1.5 신호 보내기)

다중 프로세스 서비스 프로그램에서 하위 프로세스가 종료 신호를 받으면 하위 프로세스는 스스로 종료됩니다.

상위 프로세스가 종료 신호를 받으면 모든 하위 프로세스에 종료 신호를 보낸 다음 자체적으로 종료해야 합니다.

이미지-20240711222919564

이미지-20240711222900141

이미지-20240711223111481

7. 공유 메모리

멀티스레드는 프로세스의 주소 공간을 공유합니다.여러 스레드가 동일한 메모리에 액세스해야 하는 경우 전역 변수를 사용하면 됩니다.

여러 프로세스에서 각 프로세스의 주소 공간은 독립적이며 공유되지 않습니다.여러 프로세스가 동일한 메모리에 액세스해야 하는 경우 전역 변수를 사용할 수 없으며 공유 메모리만 사용할 수 있습니다.

공유 메모리를 사용하면 여러 프로세스(프로세스 간 혈연관계가 필요하지 않음)가 동일한 메모리 공간에 액세스할 수 있습니다. 이는 여러 프로세스 간에 데이터를 공유하고 전송하는 가장 효과적인 방법입니다. 프로세스는 공유 메모리를 자신의 주소 공간에 연결할 수 있습니다. 한 프로세스가 공유 메모리의 데이터를 수정하면 다른 프로세스가 읽는 데이터도 변경됩니다.

공유 메모리는 잠금 메커니즘을 제공하지 않습니다. 즉, 프로세스가 공유 메모리를 읽고 쓸 때 다른 프로세스가 공유 메모리를 읽고 쓰는 것을 막지 않습니다.공유 메모리의 읽기/쓰기를 잠그려면 세마포어를 사용할 수 있습니다. . Linux는 공유 메모리를 작동하기 위한 일련의 기능을 제공합니다.

7.1 shmget 기능

공유 메모리를 생성/획득하는 데 사용되는 함수입니다.

 int shmget(key_t key, size_t size, int shmflg);
  • 1
  • 열쇠 공유 메모리의 키 값은 정수(typedef unsigned int key_t), 일반적으로 16진수로 표시됩니다(예: 0x5005, 서로 다른 공유 메모리의 키는 동일할 수 없습니다.
  • 크기 공유 메모리의 크기(바이트)입니다.
  • 슈엠플그 공유 메모리에 대한 액세스 권한은 파일 권한과 동일합니다. 예를 들어0666|IPC_CREAT 공유 메모리가 존재하지 않는 경우 생성함을 나타냅니다.
  • 반환 값: 성공 시 공유 메모리의 ID(0보다 큰 정수)를 반환하고, 실패 시(시스템에 메모리가 부족하고 권한이 없음) -1을 반환합니다.

이미지-20240711224223200

이미지-20240711224212293

사용 ipcs -m 키(key), 공유 메모리 ID(shmid), 소유자(owner), 권한(perms) 및 크기(바이트)를 포함하여 시스템의 공유 메모리를 볼 수 있습니다.

사용 ipcrm -m 共享内存id 공유 메모리는 다음과 같이 수동으로 삭제할 수 있습니다.

이미지-20240711225202860

참고: 공유 메모리의 데이터 유형에는 컨테이너를 사용할 수 없으며 기본 데이터 유형만 사용할 수 있습니다.

7.2 shmat 기능

이 함수는 공유 메모리를 현재 프로세스의 주소 공간에 연결하는 데 사용됩니다.

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • 1
  • 슈미드 의지하다shmget() 함수가 반환한 공유 메모리 식별자입니다.
  • 슈마드르 공유 메모리가 현재 프로세스에 연결된 주소 위치를 지정합니다. 일반적으로 시스템이 공유 메모리의 주소를 선택하도록 하려면 0을 채웁니다.
  • 슈엠플그 플래그 비트, 일반적으로 0으로 채워집니다.

호출이 성공하면 공유 메모리의 시작 주소를 반환하고, 실패하면 반환합니다. (void *)-1

7.3 shmdt 기능

이 함수는 현재 프로세스에서 공유 메모리를 분리하는 데 사용됩니다. shmat() 함수의 역연산.

int shmdt(const void *shmaddr);
  • 1
  • 슈마드르 shmat() 함수가 반환한 주소입니다.

호출이 성공하면 0을 반환하고 실패하면 -1을 반환합니다.

7.4 shmctl 함수

이 함수는 공유 메모리를 동작시키는 데 사용되며, 가장 일반적으로 사용되는 동작은 공유 메모리를 삭제하는 것입니다.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • 슈미드 shmget() 함수에서 반환된 공유 메모리 ID입니다.
  • 명령 공유 메모리를 삭제하려면 다음 사항을 입력하세요.IPC_RMID
  • 버프 공유 메모리를 동작시키는 데이터 구조체의 주소입니다. 공유 메모리를 삭제하려면 0을 입력하세요.

호출이 성공하면 0을 반환하고 실패하면 -1을 반환합니다.

참고, 활용하세요 root 생성된 공유 메모리는 생성된 권한과 관계없이 일반 사용자가 삭제할 수 없습니다.

이미지-20240711230653886

이미지-20240711230522921

7.5 순환 큐

7.6 공유 메모리 기반 순환 큐

호출이 성공하면 0을 반환하고 실패하면 -1을 반환합니다.

7.4 shmctl 함수

이 함수는 공유 메모리를 동작시키는 데 사용되며, 가장 일반적으로 사용되는 동작은 공유 메모리를 삭제하는 것입니다.

int shmctl(int shmid, int command, struct shmid_ds *buf);
  • 1
  • 슈미드 shmget() 함수에서 반환된 공유 메모리 ID입니다.
  • 명령 공유 메모리를 삭제하려면 다음 사항을 입력하세요.IPC_RMID
  • 버프 공유 메모리를 동작시키는 데이터 구조체의 주소입니다. 공유 메모리를 삭제하려면 0을 입력하세요.

호출이 성공하면 0을 반환하고 실패하면 -1을 반환합니다.

참고, 활용하세요 root 생성된 공유 메모리는 생성된 권한과 관계없이 일반 사용자가 삭제할 수 없습니다.

[외부링크 사진 전송중...(img-v6qW3XRA-1720711279572)]

[외부링크 사진 전송중...(img-CG0tGAne-1720711279572)]외부 링크 이미지 전송에 실패했습니다. 원본 사이트에 안티 리칭 메커니즘이 있을 수 있습니다. 이미지를 저장하고 직접 업로드하는 것이 좋습니다.
외부 링크 이미지 전송에 실패했습니다. 원본 사이트에 안티 리칭 메커니즘이 있을 수 있습니다. 이미지를 저장하고 직접 업로드하는 것이 좋습니다.
외부 링크 이미지 전송에 실패했습니다. 원본 사이트에 안티 리칭 메커니즘이 있을 수 있습니다. 이미지를 저장하고 직접 업로드하는 것이 좋습니다.

7.5 순환 큐

7.6 공유 메모리 기반 순환 큐