2012-10-27 2 views
0

세마포 및 공유 메모리를 사용하여 C에서 생산자 - 소비자 문제를 생성하려고합니다. 세마포 및 공유 메모리가 작동하지만 개별 소비자와 생산자를 실행하는 방법을 결정하는 데 문제가 있습니다.C에서 fork를 사용하여 백그라운드 프로세스 생성 n

이것은 숙제이며 요구 사항에는 생산자와 소비자가 단일 스레드 프로세스 여야한다고 명시되어 있습니다. 저는 교수님에게 연락을했고 그는 fork()를 사용하도록 권유했습니다. 나는 이것이 pthread()를 사용할 수 없다는 것을 의미한다고 가정한다.

현재 저는 프로듀서와 소비자를위한 별도의 응용 프로그램이 있습니다 (즉, 각각 고유 한 main()가 있습니다). 사용자가 지정한대로 많은 수의 프로듀서 및 소비자 집합을 실행할 수 있어야하고 설정된 시간이 지난 후에 응용 프로그램을 종료 할 수 있어야합니다.

원래 나는 이것이 갈래의 프로세스를 실행하기 전에 세마포어를 닫습니다 응용 프로그램과 같은 문제에 이르게 물론이

int Ppid = fork(); 
if(Ppid == 0){ 
    execv("pathtoproducer", NULL); 
} 
int Cpid = fork(); 
if(Cpid == 0){ 
    execv("pathtoconsumer", NULL); 
} 
//close semaphores and detach shared memory 

을 시도했다.

그래서 나는이 같은 일을 생각 해요 :

int pid = fork(); 
if(pid == 0){ 
    execv("pathtoproducer", NULL); 
    execv("pathtoconsumer", NULL); 
} 
else{ 
    //wait for timer to run out 
} 
//detach shared memory and close semaphore 

그러나 물론 나는 실행되지 않습니다 소비자 execv와 사용하고 있기 때문이다. 생산자와 소비자 모두를 끌어 들이기 위해 사용할 수있는 무언가가 있습니까 (이 예제에서 n 개의 값을 가져야 함을 명심하십시오,이 예제에서는 하나의 세트로 시도하고 있습니다).

감사합니다.

답변

1

글쎄, 항상 중첩 된 포크를 할 수 있습니다.

int pid = fork(); 
if (pid == 0){ 
    int pid2 = fork(); 
    if (pid2 == 0) 
     execv("pathtoproducer", NULL); 
    else 
     execv("pathtoconsumer", NULL); 
} else { 

btw. 타이머보다 자녀를 기다리는 더 좋은 방법이 있습니다.

+0

테스트를 위해 제작자와 소비자가 공유 메모리 및 세마포를 편집하는 대신 실제 사실대로 처리해야합니다. 나는이 코드를 작동시킬 수 없다. 생성자를 만든 다음 나머지 부모를 실행 한 다음 내 콘솔 행 (user @ user-whatever)을 다시 인쇄 한 다음 제작자를 실행합니다. 난 그냥 소비자와 생산자의 쌍을 만들고 할당 된 시간 후에 끝내고 다음 부모의 나머지 코드를 실행하고 싶습니다. – user1287523

0

아마도 귀하의 요구 사항 중 일부가 누락되었지만이 문제는 그보다 더 어렵게 만드는 것 같습니다.

for (i=0...numConsumers) 
    fork consumers; //they can't do anything without something to consume 

for (i=0...numProducers) 
    fork producers; 

select(null, null, null, null, timetowait); 

for (i=0...numProducers + numConsumers) 
    kill(childPid, sigusr1); 
    wait(); 

//whatever remain todo in parent... 

당신은 잡은 프로그램 (들)이 다음 질서에 자신을 종료로 진행됩니다 생산자/소비자 프로그램에서 간단한 신호 처리기가 필요합니다. 신호를 사용하고 싶지 않다면, 파이프를 사용하거나 간단한 공유 메모리 스위치를 포함하여 무엇이든 사용할 수 있습니다.

관련 문제