프로 세 스 식별 자 조작 함수
모든 프로 세 스 는 음정 형 이 아 닌 유일한 프로 세 스 ID 를 가지 고 있 습 니 다.유일한 것 이지 만 프로 세 스 ID 는 재 활용 이 가능 합 니 다. 프로 세 스 가 종 료 될 때 프로 세 스 ID 는 재 활용 후보자 가 됩 니 다.대부분의 유 닉 스 시스템 은 지연 복용 알고리즘 을 사용 하여 새 프로 세 스에 부여 한 ID 가 최근 프로 세 스 를 종료 한 ID 와 다 르 게 함으로써 같은 ID 를 사용 한 종 료 된 이전 프로 세 스 로 오인 되 지 않도록 합 니 다.
시스템 에는 일부 전용 프로 세 스 가 있 지만 구체 적 인 세부 사항 은 실현 에 따라 다르다.ID 가 0 인 프로 세 스 는 보통 스케줄 러 프로 세 스 로 교환 프로 세 스 라 고 불 린 다.이 프로 세 스 는 커 널 의 일부분 으로 디스크 에 있 는 프로그램 을 실행 하지 않 기 때문에 시스템 프로 세 스 라 고도 불 린 다.프로 세 스 ID 1 은 보통 init 프로 세 스 (Mac OS X 10.4 에 서 는 launchd 프로 세 스) 이 며, 들 기 프로 세 스 가 끝 날 때 유 닉 스 시스템 을 시작 하기 위해 커 널 에서 호출 됩 니 다.이 프로 세 스 의 프로그램 파일 은 일반적으로 / etc / init 또는 / sbin / init 입 니 다. 시스템 과 관련 된 초기 화 파일, 예 를 들 어 / etc / rc * 파일, / etc / inittab 파일 과 / etc / init. d 의 파일 등 을 읽 고 시스템 을 한 상태 로 유도 합 니 다 (예 를 들 어 여러 사용자).init 프로 세 스 는 커 널 이 아 닌 일반 사용자 프로 세 스 이지 만 슈퍼 사용자 특권 으로 실 행 됩 니 다.그 밖 에 모든 UNIX 시스템 은 운영 체제 서 비 스 를 제공 하 는 커 널 프로 세 스 가 있 습 니 다. 예 를 들 어 일부 UNIX 의 가상 메모리 구현 에서 프로 세 스 ID 2 는 페이지 데 몬 으로 가상 메모리 시스템 의 페이지 작업 을 지원 합 니 다.
프로 세 스 ID 를 제외 하고 모든 프로 세 스 에는 다른 식별 자가 있 습 니 다.다음 함 수 는 이 식별 자 들 을 되 돌려 줍 니 다.
#include
pid_t getpid(void); /* : ID */
pid_t getppid(void); /* : ID */
uid_t getuid(void); /* : ID */
uid_t geteuid(void); /* : ID */
gid_t getgid(void); /* : ID */
gid_t getegid(void); /* : ID */
기 존 프로 세 스 는 fork 함 수 를 호출 하여 새로운 하위 프로 세 스 를 만 들 수 있 습 니 다.
#include
pid_t fork(void); /* : 0, ID; , -1 */
fork 함 수 는 한 번 호출 되 었 으 나 두 번 되 돌려 줍 니 다. 하위 프로 세 스 는 0 을 되 돌려 주 고 부모 프로 세 스 는 새 하위 프로 세 스 의 프로 세 스 ID 를 되 돌려 줍 니 다.하위 프로 세 스 와 부모 프로 세 스 는 fork 호출 후의 명령 을 계속 수행 합 니 다.하위 프로 세 스 는 부모 프로 세 스 의 복사 본 입 니 다. 예 를 들 어 하위 프로 세 스 는 부모 프로 세 스 의 데이터 공간, 스 택 의 복사 본 을 얻 습 니 다. 이 저장 공간 부분 을 공유 하 는 것 이 아니 라 하위 프로 세 스 와 부모 프로 세 스 는 본문 을 공유 합 니 다.그러나 fork 이후 exec 를 따라 다 니 기 때문에 현재 많은 실현 은 부모 프로 세 스 데이터 세그먼트, 쌓 기, 스 택 의 전체 복사 본 을 실행 하지 않 고 쓰기 시 복사 (Copy - On - Write, COW) 기술 을 사용 하고 있 습 니 다.이 영역 은 부모 프로 세 스 와 하위 프로 세 스 가 공유 하고 커 널 은 접근 권한 을 읽 기 전용 으로 변경 합 니 다.부모 프로 세 스 와 하위 프로 세 스 중 하나 가 이 영역 을 수정 하려 고 한다 면 커 널 은 영역 을 수정 하 는 메모리 에 만 복사 본 을 만 듭 니 다. 보통 가상 저장 시스템 의 한 페이지 입 니 다.
다음은 fork 함수 의 예제 입 니 다. 하위 프로 세 스 가 변수 에 대한 수정 이 부모 프로 세 스에 영향 을 주지 않 는 다 는 것 을 볼 수 있 습 니 다.
#include
#include
#include
int globval = 6; // external variable in initialized data.
char buf[] = "a write to stdout
";
int main(void){
int var = 88; // automatic variable on the stack
pid_t pid;
// null
if(write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1){
printf("write error
");
exit(2);
}
printf("before fork
"); // we don't flush stdout
if((pid=fork()) < 0){
printf("fork error
");
exit(2);
}else if(pid == 0){ // child
globval++;
var++;
}else{ // parent
sleep(2);
}
printf("pid=%ld, glob=%d, var=%d
", (long)getpid(), globval, var);
exit(0);
}
운행 결 과 는 다음 과 같다.
$ ./forkDemo.out
a write to stdout
before fork
pid=430, glob=7, var=89 #
pid=429, blob=6, var=88
$
$ ./forkDemo.out > temp.out
$ cat temp.out
a write to stdout
before fork #
pid=432, blob=7, var=89
before fork #
pid=431, blob=6, var=88
$
일반적으로 fork 이후 부모 프로 세 스 와 하위 프로 세 스 의 실행 순서 가 불확실 합 니 다. 이것 은 커 널 이 사용 하 는 스 케 쥴 링 알고리즘 에 달 려 있 습 니 다.부모 프로 세 스 와 하위 프로 세 스 간 의 동기 화 를 요구 하면 어떤 형식의 프로 세 스 간 통신 을 요구 합 니 다.
이 프로그램 에 서 는 fork 와 I / O 함수 간 의 상호작용 관 계 를 주의해 야 합 니 다.write 함 수 는 버퍼 가 없 기 때문에 write 는 fork 전에 호출 되 기 때문에 데 이 터 를 표준 출력 에 한 번 씁 니 다.그러나 표준 I / O 라 이브 러 리 는 버퍼 가 있 습 니 다. 표준 출력 이 터미널 장치 에 연결 되면 줄 버퍼 입 니 다.그렇지 않 으 면 그것 은 전부 완충 된다.따라서 이 프로그램 을 대화 식 으로 실행 할 때 이 printf 출력 줄 만 한 번 받 을 수 있 습 니 다. 표준 출력 버퍼 는 줄 바 꿈 문자 로 현상 되 기 때 문 입 니 다.표준 출력 을 파일 로 바 꿀 때 printf 출력 줄 을 두 번 받 습 니 다.이것 은 fork 전에 printf 를 한 번 호출 했 기 때 문 입 니 다. 그러나 fork 를 호출 할 때 이 줄 은 버퍼 에 있 습 니 다. 그리고 부모 프로 세 스 데이터 공간 을 하위 프로 세 스에 복사 할 때 이 버퍼 데이터 도 하위 프로 세 스에 복 사 됩 니 다. 이때 부모 프로 세 스 와 하위 프로 세 스 는 각각 이 줄 에 있 는 버퍼 가 있 습 니 다.exit 이전의 두 번 째 printf 에서 데 이 터 를 기 존 버퍼 에 추가 합 니 다.모든 프로 세 스 가 종 료 될 때 버퍼 의 내용 이 해당 파일 에 기 록 됩 니 다.
또한, fork 의 한 특성 은 부모 프로 세 스 의 모든 열 린 파일 설명자 가 하위 프로 세 스 로 복 사 됩 니 다.중요 한 것 은 부모 프로 세 스 와 하위 프로 세 스 가 같은 파일 오프셋 을 공유 하 는 것 입 니 다 (구체 적 으로 파일 공유 절 을 참고 할 수 있 습 니 다).따라서 위 프로그램 에서 sleep () 와 같은 함수 로 하위 프로 세 스 가 종 료 될 때 까지 기다 리 지 않 으 면 출력 이 서로 혼 합 될 수 있 습 니 다.
파일 을 여 는 것 외 에 부모 프로 세 스 의 다른 대부분의 속성 도 하위 프로 세 스에 의 해 계승 된다. 예 를 들 어 프로 세 스 그룹 ID, 실제 그룹 ID, 저장 이미지 와 자원 제한 등 이다.
부모 프로 세 스 와 하위 프로 세 스 의 차 이 는 주로 다음 과 같 습 니 다.
* fork 의 반환 값 이 다 릅 니 다.
* 프로 세 스 ID 가 다 릅 니 다.
* 각각 부모 프로 세 스 ID 가 다 릅 니 다.
* 하위 프로 세 스 tmsutime、tms_stime、tms_cutime 와 tmsustime 의 값 을 0 으로 설정 합 니 다.
* 하위 프로 세 스 는 부모 프로 세 스 가 설정 한 파일 잠 금 을 계승 하지 않 습 니 다.
* 하위 프로 세 스 의 처리 되 지 않 은 알 람 이 제거 되 었 습 니 다.
* 하위 프로 세 스 의 처리 되 지 않 은 신호 집합 을 빈 집합 으로 설정 합 니 다.
일반적으로 fork 를 실패 하 게 하 는 두 가지 주요 원인 은 (a) 시스템 에 너무 많은 프로 세 스 가 있 고 (b) 실제 사용자 ID 의 프로 세 스 총수 가 제한 을 초과 한 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux 커 널 - 프로 세 스 - dofork()fork: 부모 프로 세 스 의 모든 자원 은 데이터 구조의 복 제 를 통 해 하위 프로 세 스에 유전 된다.쓸 때 복사 하면 부자 프로 세 스 가 같은 물리 페이지 를 읽 을 수 있 도록 합 니 다. clone: ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.