링크 ux 프로 세 스 학습
11400 단어 Linux
프로 세 스 시스템
리 눅 스 는 다 중 태 스 크 다 중 사용자 의 운영 체제 로 시스템 이 직접 관리 하 는 모든 작업 의 최소 단위 가 프로 세 스 (process) 입 니 다.프로 세 스 마다 하나의 식별 자 pid 가 있 습 니 다. 프로 세 스 마다 pid 가 다 릅 니 다. Shell 에 ps - A 를 입력 하면 현재 의 모든 프로 세 스 를 표시 할 수 있 습 니 다.하나의 프로 세 스 가 하나의 프로그램 (application) 을 대표 하 는 것 은 아 닙 니 다. 하나의 프로그램 이 여러 프로 세 스 에 대응 할 수도 있 고 실행 가능 한 파일 (executable file) 을 대표 하 는 것 도 아 닙 니 다. 일부 실행 가능 한 파일 은 여러 개 를 동시에 실행 할 수 있 기 때문에 서로 무관 합 니 다.
Linux 에서 프로 세 스 는 서로 독립 된 것 이 아 닙 니 다. 모든 프로 세 스 (init 프로 세 스 제외) 는 부모 프로 세 스 (parent process) 가 있 고 모든 프로 세 스 는 0 개 1 개 이상 의 키 프로 세 스 (child process) 가 있 습 니 다.리 눅 스 의 프로 세 스 는 트 리 구조 로 셸 에 pstree 를 입력 하면 이 트 리 의 모양 을 볼 수 있 습 니 다.다음 그림 은 pstree 가 결과 의 일부분 을 되 돌려 줍 니 다.
init─┬─NetworkManager─┬─dhclient
│ └─{NetworkManager}
├─SystemToolsBack
├─avahi-daemon───avahi-daemon
├─bonobo-activati───{bonobo-activati}
├─console-kit-dae───63*[{console-kit-dae}]
├─hald───hald-runner─┬─hald-addon-acpi
│ ├─hald-addon-cpuf
├─pulseaudio─┬─gconf-helper
│ └─2*[{pulseaudio}]
├─rsyslogd───2*[{rsyslogd}]
├─seahorse-daemon
├─telepathy-gabbl
├─telepathy-haze─┬─telepathy-haze
│ └─{telepathy-haze}
├─trashapplet
└─wpa_supplicant
C 언어 에서 현재 프로 세 스 를 얻 은 pid 의 함 수 는 pid 입 니 다.t getpid(void);,현재 프로 세 스 의 부모 프로 세 스 를 가 져 오 는 pid 의 함 수 는 pid 입 니 다.t getppid(void);,둘 다 유 니스 트 d. h 에서 성명 합 니 다.
사용자 와 권한
Linux 는 다 중 사용자 시스템 이기 때문에 커 널 에 강력 한 사용자 제어 가 있 기 때문에 모든 프로 세 스 는 실제 사용자 ID (uid) 의 소유자 가 있 습 니 다.시스템 uid 는 사용자 이름과 다른 정수 입 니 다.기본 적 인 상황 에서 프로 세 스 의 uid 는 부모 프로 세 스 를 계승 합 니 다.예 를 들 어 저 는 소유자 가 by void (uid 1000) 인 bash 터미널 로 프로 세 스 를 시 작 했 습 니 다. 그러면 이 프로 세 스 의 uid 도 1000 입 니 다.사용자 uid 는 uid 를 통 해t getuid(void);함수 획득.권한 이 만족 하면 프로그램 이 실 행 될 때 uid 를 수정 할 수 있 습 니 다. C 언어 함 수 는 int setuid (uid t uid) 입 니 다.0 반환 을 성공 적 으로 실행 하지 않 으 면 - 1 을 되 돌려 줍 니 다.루트 사용자 권한 이 있 는 프로 세 스 만 uid 를 설정 할 수 있 습 니 다.
이외에 도 프로 세 스 에 유효한 사용자 ID (euid) 가 있 습 니 다.euid 는 프로 세 스 파일 시스템 권한 을 결정 하 는 신분 입 니 다. 일반적으로 프로 세 스 euid 와 uid 는 같 습 니 다.C 언어 에서 uidt geteuid(void);함수 가 프로 세 스 euid 를 가 져 옵 니 다.마찬가지 로 euid 도 수정 할 수 있 습 니 다. 함 수 는 int seteuid (uid t uid) 입 니 다.현재 uid 와 euid 중 하나 이상 이 0 (root) 일 때 만 euid 를 설정 할 수 있 습 니 다.바 이 너 리 실행 가능 한 파일 소유자 가 루트 이 고 chmod + s 에 의 해 실 행 된 후 일반 사용자 의 신분 에서 실 행 됩 니 다. 이 때 발생 하 는 프로 세 스 uid 는 일반 사용자 이 고 euid 는 0 (root) 입 니 다. 이 경우 이 프로 세 스 는 루트 와 같은 권한 을 가지 고 있 습 니 다.
프로 세 스 생 성
fork 함수
Linux 는 사용자 프로 세 스 의 하위 프로 세 스 를 만 들 수 있 도록 합 니 다. C 언어 에서 pidt fork(void);함수 구현.포크 함수 의 기본 기능 은 하위 프로 세 스 를 만 들 고 현재 프로 세 스 의 데이터 세그먼트 와 스 택 세그먼트, 하위 프로 세 스 와 부모 프로 세 스 의 공용 코드 세그먼트 를 복사 하 는 것 입 니 다.스 택 세그먼트 를 복 사 했 기 때문에 부모 프로 세 스 와 하위 프로 세 스 는 모두 fork 함수 의 스 택 프레임 에 머 물 렀 습 니 다. fork 함 수 는 두 번 되 돌아 가 야 합 니 다. 한 번 은 부모 프로 세 스 에서 되 돌아 가 고 한 번 은 하위 프로 세 스 에서 되 돌아 가 야 하지만 두 번 의 반환 값 은 다 릅 니 다.부모 프로 세 스에 서 fork 함수 반환 값 은 하위 프로 세 스 의 pid (호출 에 성공 하면) 이 고, 하위 프로 세 스에 서 fork 함수 의 반환 값 은 0 입 니 다.따라서 반환 값 에 따라 프로그램의 운행 절 차 를 정할 수 있다.부모 프로 세 스 와 하위 프로 세 스 는 기본적으로 동기 화 되 어 있 습 니 다. 시스템 커 널 에서 스케줄 링 을 하고 어느 것 을 먼저 실행 하 는 지 알 수 없습니다.부자 프로 세 스 의 데이터 세그먼트 와 스 택 세그먼트 가 모두 독립 되 어 있 기 때문에 서로 간섭 하지 않 고 각각 메모리 가 직접 공유 되 지 않 습 니 다.
실행 프로그램
Linux 에서 외부 프로그램 을 실행 하려 면 하위 프로 세 스 를 만들어 야 합 니 다. 커 널 실행 프로그램의 명령 exec 는 현재 프로 세 스 의 주소 공간의 모든 내용 을 바 꾸 고 계속 실행 하기 때 문 입 니 다. 다른 프로그램 을 실행 하 는 것 은 현재 프로그램 이 더 이상 실행 되 지 않 는 다 는 것 을 의미 합 니 다.C 언어 에 서 는 exec 와 같은 함수 가 아니 라 다음 함수 가 있 습 니 다.
int execl (const char * file,const char * arg,...);
int execlp(const char * file,const char * arg,...);
int execle(const char * file,const char * arg,...,NULL,char * const envp[ ]);
int execv (const char * file, char * const argv[ ]);
int execvp(const char *file ,char * const argv []);
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
그 중에서 execl 로 시작 하 는 함수, 첫 번 째 매개 변수 file 은 실행 가능 한 파일 이름 이 고 그 다음 에 몇 개의 매개 변수 가 있 습 니 다. 각각 들 어 오 는 argv [0], argv [1], argv [2],.....................................file 매개 변수 가 경로 이름 ('/' 포함) 이면 execl 함 수 는 파일 로 직접 위 치 를 정 하고 실행 합 니 다. 그렇지 않 으 면 현재 디 렉 터 리 에서 만 파일 을 찾 고 execlp 함수 가 파일 이름 을 만나면 환경 변수 PATH 순서 로 찾 습 니 다.execle 의 마지막 매개 변 수 는 2 차원 문자 배열 로 프로그램 에 전 달 된 새로운 환경 변수 목록 을 표시 합 니 다.execv, execvp, execve 는 앞의 세 가지 용법 과 비슷 하지만 가 변 적 인 매개 변수 목록 으로 파 라 메 터 를 전달 하지 않 고 2 차원 문자 배열 로 바 꿉 니 다.상기 함수 가 실 패 했 을 때 - 1 을 되 돌려 줍 니 다. 실행 에 성공 하면 되 돌아 오지 않 습 니 다. 코드 세그먼트 가 새로운 실행 가능 한 프로그램 으로 바 뀌 었 기 때 문 입 니 다.
프로 세 스 블록
wait 함수
실제 응용 프로그램 에 서 는 부모 프로 세 스 를 멈 추고 하위 프로 세 스 가 실 행 될 때 까지 기 다 려 야 할 때 가 있 습 니 다. 이 때 는 프로 세 스 차단 (process blocking) 이 필요 합 니 다.C 언어 에서 pid 사용t wait (int * statloc) 함 수 는 하위 프로 세 스 의 종료 정 보 를 얻 을 수 있 습 니 다.wait 함 수 를 호출 하 는 프로 세 스 가 막 힙 니 다. 이 프로 세 스 의 임의의 하위 프로 세 스 가 끝 날 때 까지 wait 함 수 는 끝 난 하위 프로 세 스 의 pid 를 되 돌려 줍 니 다. 끝 정 보 는 statloc 포인터 가 가리 키 는 메모리 영역 에 저 장 됩 니 다.이 프로 세 스 가 활성 화 된 하위 프로 세 스 가 없 으 면 즉시 오류 가 발생 하고 - 1 로 돌아 갑 니 다.statloc 포인터 가 NULL 이면 프로 세 스 가 끝 난 상태 에 관심 이 없다 는 뜻 입 니 다.여러 개의 키 프로 세 스 가 있 으 면 wait 함수 가 어떤 숫자 로 돌아 갈 지 불확실 한 지 pid 를 통 해 판단 해 야 합 니 다.
만약 우리 가 특정한 프로 세 스 를 기 다 려 야 한다 면 pid 를 사용 할 수 있 습 니 다.t waitpid (pid t pid, int * statloc, int options) 함수.waitpid 함수 의 첫 번 째 매개 변 수 는 기다 릴 프로 세 스 pid 를 지정 하고 더 많은 옵션 이 있 습 니 다.
좀 비 진행 과정
하위 프로 세 스 가 종 료 될 때 부모 프로 세 스 가 wait 를 통 해 상태 정 보 를 얻 지 않 으 면 이 정 보 는 커 널 메모리 에 계속 남아 있 고 하위 프로 세 스 의 pid 도 제거 되 지 않 습 니 다. 부모 프로 세 스 가 종 료 될 때 까지 이 하위 프로 세 스 는 좀 비 프로 세 스 (zombie process) 라 고 합 니 다.좀 비 프로 세 스 는 적은 메모리 만 차지 하지만 장기 적 으로 실행 되 는 서버 라면 많은 좀 비 프로 세 스 가 쌓 여 시스템 프로 세 스 표 가 가득 차 서 새로운 프로 세 스 를 만 들 수 없습니다.좀 비 프로 세 스 를 만 드 는 것 은 쉬 운 일이 다. 하위 프로 세 스 를 부모 프로 세 스 보다 먼저 종료 시 키 면 된다. 부모 프로 세 스 가 종료 되 기 전에 하위 프로 세 스 는 좀 비 프로 세 스 가 될 것 이다.
고아 의 노정
좀 비 프로 세 스 와 달리 부모 프로 세 스 가 막 히 지 않 고 하위 프로 세 스 보다 먼저 종료 되면 하위 프로 세 스 는 고아 프로 세 스 (orphan process) 가 됩 니 다.Linux 시스템 에서 init 프로 세 스 는 모든 고 아 를 입양 하 는 과정 을 책임 집 니 다. 즉, 고아 프로 세 스 의 부모 프로 세 스 는 init 프로 세 스 로 설 정 됩 니 다.init 프로 세 스 는 시스템 데 몬 프로 세 스 (daemon process) 로 서 wait 함 수 를 계속 호출 하여 입양 을 기다 리 는 고아 프로 세 스 가 종료 되 며 좀 비 프로 세 스 가 발생 하지 않 습 니 다.
고아 프로 세 스 를 이용 하여 좀 비 프로 세 스 를 피하 다.
부모 프로 세 스 를 막 고 하위 프로 세 스 가 처 리 된 후에 계속 할 수 없 는 경우 가 많 습 니 다. 예 를 들 어 여러 사용자 의 서버 프로그램 에서.이때 하위 프로 세 스 가 업 무 를 처리 하 게 하면 많은 좀 비 프로 세 스 가 생 긴 다.좀 비 프로 세 스 를 피 하 는 대표 적 인 방법 은 고아 프로 세 스 를 이용 하 는 것 이다. 구체 적 인 방법 은 먼저 아버지 프로 세 스 로 키 프로 세 스 를 만 든 다음 에 아들 프로 세 스 가 즉시 손자 프로 세 스 를 만 들 고 손자 프로 세 스 로 사 무 를 처리 하 는 것 이다.부모 프로 세 스 가 기다 리 는 것 을 막 고 하위 프로 세 스 를 즉시 종료 합 니 다.이때 자식 프로 세 스 가 종료 되 었 기 때문에 손자 프로 세 스 는 고아 프로 세 스 가 되 어 init 에 입양 되 었 다.하위 프로 세 스 가 즉시 종료 되면 부모 프로 세 스 는 신 호 를 받 고 하위 프로 세 스 를 정확하게 소각 합 니 다. 이에 비해 부모 프로 세 스 는 무시 할 수 있 는 순간 만 막 혔 습 니 다.다음 프로그램 은 좀 비 진행 을 피 하 는 예 다.
#include
#include
#include
int main(void)
{
if(fork() == 0) //启动一个子进程
{
printf("the child
");
if(fork() == 0) //启动一个孙子进程
{
printf("do something you want
");
sleep(5);
printf("done
");
exit(0);
}
else //子进程立刻退出
exit(0);
}
else
{ //父进程立即阻塞
wait(NULL);
printf("the parent
");
sleep(10);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.