2012-11-19 9 views
14

fork()을 C로 사용하여 프로세스의 복사본을 만들고 싶습니다. 내 프로세스의 복사본에 인수를 전달하는 방법을 알 수 없습니다. 예를 들어, 정수를 프로세스 사본에 전달하려고합니다.fork()에 의해 생성 된 프로세스에 인수를 전달하는 방법

또는 내가 포크()를 호출 및 프로세스에 고유 한 값 전달하고자하는 루프가 있다면 나는 무엇을 할 수있는 (예를 들어 0 ... N)

for (int i = 0; i < 4; ++i) { 
    fork(); 
    // pass a unique value to new processes. 
} 
+2

'fork'는 진행중인 프로세스의 복사본을 생성합니다. * 프로세스를 초기화하지 않습니다 *. – Beta

+0

http://advancedlinuxprogramming.com/ –

답변

15

fork()의 좋은 부분은 당신이 자동으로 산란 각 프로세스는 모든의 사본을 얻을 수 있다는 것이다 부모는, 예를 들면 때문에, 이제 우리는 두 개의 자식 프로세스의 각각의 int myvar를 통과하고 싶은 말을 할 수 있지만 각각의 부모 프로세스에서 다른 값을 갖고 싶어 :

int main() 
{ 
    int myvar = 0; 
    if(fork()) 
     myvar = 1; 
    else if(fork()) 
     myvar = 2; 
    else 
     myvar = 3; 

    printf("I'm %d: myvar is %d\n", getpid(), myvar); 
    return 0; 
} 

그렇게이 허용하는 각 프로세스 myvar의 "복사"를 가지고를 그것으로 자신의 가치입니다.

I'm 8517: myvar is 1 
I'm 8518: myvar is 2 
I'm 8521: myvar is 3 

값을 변경하지 않은 경우 각 fork 프로세스는 동일한 값을 갖습니다.

+0

감사합니다. 너는 머리에 못을 박았다. –

1

가의 exec() family을 참조하십시오 기능.

편집 : 기본 프로세스와 동일한 프로그램의 복사본을 초기화하려는 경우 duskwuff에서 제안한대로 변수를 계속 사용하십시오.

1

clone() (실제로 fork() 자체에서 사용됨)을 사용할 수 있습니다. 입력 기능에 arg을 전달할 수 있습니다.

http://linux.die.net/man/2/clone

+3

아니요,하지 마십시오. 'clone'은 리눅스에 대한 아주 좋은 지식을 요구하는 복잡한 리눅스 특유의 시스템 콜이며, 대부분은 리눅스 * 라이브러리 (* pthread)를 구현하는 소수의 전문가에게 예약되어 있습니다. 'futex (7)'맨 페이지를 참고하십시오. –

+0

@BasileStarynkevitch : 바로 그렇습니다. 실제 로우 레벨 해킹을하고있는 경우에만 클론을 사용하십시오. 클론의 유일한 포인트는 이전에 스레드 구현과 같은 커널 공간에서만 발생할 수 있었던 사용자 공간에서 몇 가지 작업을 수행 할 수있게하는 것입니다. 그것은 일반적으로 사용하는 시스템 콜이 아닙니다. – Linuxios

7

로컬 및 글로벌 변수는 본질적으로 fork()에 걸쳐 보존, 그래서 "인수를 전달"할 필요가 없습니다. 당신이 갈래 과정에서 함수를 호출하는 경우, 당신은 같은 작업을 수행 할 수 있습니다

pid_t pid = fork(); 
if (pid == 0) { 
    funcToCallInChild(argument); 
    exit(0); 
} 
6

나는 응답 할 늦었 어,하지만 여기에 내가 그것을 할 방법은 다음과 같습니다

const char *progname = "./yourProgName"; 
const char *argument1 = "arg1"; 
const char *argument2 = "arg2"; 

if (fork() == 0) 
{ 
    // We are the child process, so replace the process with a new executable. 
    execl(progname, progname, argument1, argument2, (char *)NULL); 
} 
// The parent process continues from here. 

먼저, 포크() 프로세스를 새로운 프로세스를 만들 수 있습니다. 이전 메모리와 동일한 메모리 공간을가집니다. fork()는 부모 프로세스와 자식 프로세스 모두를 반환합니다. fork()가 0을 반환하면, 당신은 자식 프로세스입니다. 그런 다음 하위 프로세스는 execl()을 사용하여 프로세스 메모리를 새 파일의 메모리로 대체합니다.

progname은 execl()에 두 번 주어집니다. 첫 번째는 execl()이 실제로 실행하려고 시도하는 것이며, 두 번째는 argv [0]입니다. 둘 다 제공해야합니다. 그렇지 않으면 인수 카운트가 1 씩 해제됩니다. Progname은 필요한 실행 가능 이미지를 찾기 위해 필요한 모든 경로 정보를 포함해야합니다.

이 예제에서는 두 가지 인수를 제공하지만 원하는만큼 전달할 수 있습니다. 그것은 NULL로 끝나야하고, 내가 보여 주듯이 (char *)로 캐스팅해야한다고 생각합니다.

이 접근 방식은 인수와 고유 한 PID를 사용하여 완전히 독립적 인 프로세스를 제공합니다. 상위 프로세스가 종료 된 후 오랫동안 계속 실행하거나 상위 프로세스보다 종료 될 수 있습니다.

관련 문제