fork pid 예제

포크 개념에 대한 초기 참조 중 하나는 1962년에 출판된 멜빈 콘웨이의 멀티프로세서 시스템 설계에 나타났습니다[1]. 콘웨이의 논문은 GENIE 시간 공유 시스템에서 포크의 L. 피터 도이치에 의해 구현 동기를 부여, 개념은 초기 외관에 대한 켄 톰슨에 의해 빌려졌다 [2] 연구 유닉스 [3][4]. 포크는 나중에 POSIX의 표준 인터페이스가되었다. [5] 클래스에서 이미 보았듯이 fork() 명령은 실행 중인 프로세스의 전체 복사본을 만들고 두 명령을 구별하는 유일한 방법은 반환된 값을 보는 것입니다. 다음 예제 [1]에 명시된 대로 포크를 사용하여 두 프로세스를 실행할 수 있음을 읽었습니다. 그러나 아래 프로세스를 병렬로 실행할 수 있는지 궁금합니다. 나는 당신이 제공 할 수있는 제안이나 지침에 시간을 주셔서 감사합니다. ~MA int i; (i=0; i<3; i++) 포크(); printf ("안녕하세요"); 자식 프로세스는 부모의 파일 설명자의 복사본으로 시작합니다.

[5] 프로세스 간 통신의 경우, 부모 프로세스는 종종 파이프 또는 여러 파이프를 생성하고, 다음 포크 후 프로세스가 필요하지 않은 파이프의 끝을 닫습니다. [6] “복제”는 Linux 커널의 시스템 호출로, 실행 컨텍스트의 일부를 부모와 공유할 수 있는 자식 프로세스를 만듭니다. FreeBSD의 rfork 및 IRIX의 sproc 처럼, 리눅스의 클론 계획 9의 rfork에서 영감을 하 고 스레드를 구현 하는 데 사용할 수 있습니다 (비록 응용 프로그램 프로그래머는 일반적으로 pthread와 같은 높은 수준의 인터페이스를 사용 합니다., 복제의 상단에 구현). 계획 9및 IRIX의 “별도 스택” 기능은 (Linus Torvalds에 따르면) 너무 많은 오버헤드를 발생시키기 때문에 생략되었습니다. [18] 리눅스가 과거에서이 유령을 부활 오히려 불행한. BSD 맨 페이지 상태: “이 시스템 호출 적절 한 시스템 공유 메커니즘을 구현 하는 경우 제거 됩니다. 사용자는 vfork()의 의미체계를 공유하는 메모리에 의존해서는 안 되며, 이 경우 포크(2)의 대명사로 만들어져야 합니다.” 마찬가지로 vfork용 Linux man 페이지는 fork.c의 소스 코드가 실행된 시점과 getpid.c가 실행된 시간 사이에 운영 체제에서 약 1,000개의 프로세스가 만들어졌습니다. 간단한 C 언어 프로그램을 작성합니다. 포크 명령을 사용하여 프로세스를 시작합니까? 실행 중인 프로세스의 상태 정보를 얻습니까? 프로세스를 종료? C 프로그램을 컴파일하고 실행합니다.

vfork의 다른 문제로는 동적 연결과의 상호 작용으로 인해 다중 스레드 프로그램에서 발생할 수 있는 교착 상태가 포함됩니다. [12] vfork 인터페이스를 대체하기 위해 POSIX는 포크와 임원의 동작을 결합한 posix_swn 함수 제품군을 도입했습니다. 이러한 기능은 포크의 관점에서 라이브러리 루틴으로 구현 될 수있다, 리눅스에서 수행되는 것처럼,[12] 또는 더 나은 성능을 위해 vfork의 관점에서, Solaris에서 수행되는 것처럼,[12][13] 하지만 POSIX 사양노트그들은 “커널 작업으로 설계”, 특히 제한된 하드웨어 및 실시간 시스템에서 실행되는 운영 체제용입니다. [14] 다른 프로세스인 부모는 항상 양수인 자식의 프로세스 식별자를 포크에서 수신합니다. 부모 프로세스는 이 식별자를 waitpid 시스템 호출에 전달하여 자식이 종료될 때까지 실행을 일시 중단합니다. 이 경우 부모는 실행을 다시 시작하고 return 문을 통해 종료합니다.