我被要求將消費者(客戶端)開發到生產者(服務器),生產者創建進程,等待消費者讀取共享內存和刪除的進程,然後將控制傳回給生產者以殺死進程並關閉共享內存塊。進程間通信fork() - 定時等待()和/或睡眠()
我研究了睡眠和等待之間的區別,並意識到只要fork()被調用,子進程就開始運行。
下面的代碼是在創建進程之後檢查它們是否是父進程。如果是,他們等待(0)。 *現在對於我的問題,我如何知道消費者中的代碼開始執行的位置,以及如何將其傳回? *
else if(pid > 0)
{
wait(0);
}
下面可以看到生產者使用的主循環。
int noToCreate = atoi(argv[2]); // (user inputs on cmd line "./prod 20 10 5" - 20 size of shared mem, 10 process to be created, 5 processes to be deleted)
while(*memSig != 2)
{
while(*memSig == 1) // set memsignature to sleep while..
{
sleep(1);
}
for(B = 0; B < noToCreate; B++)
{
pid = fork();
if(pid == -1)
{
perror("Error forking");
exit(1);
}
else if(pid > 0)
{
wait(0);
}
else
{
srand(getpid());
while(x == 0)
{
if(*randNum == 101)
{
*randNum = rand() % (100 -
1) + 1;
*pidNum = getpid();
printf("priority: %d
Process ID: %d \n", *randNum, *pidNum);
x = 1;
}
else
{
*randNum++;
*pidNum++;
}
}
exit(0);
}
} /* Closes main for loop */
if(*memSig == 0)
{
*memSig = 1;
}
} /* Closes main while loop */
多謝你們:)
感謝您的回覆。 我不需要使用管道,相反,生產者和消費者應該閱讀共享內存中的內容,並根據內存中設置的指針標誌執行各種任務。 如果你希望看到它,我可以在我的上面的答案中附上完整的producer.c代碼,會有幫助嗎? – viKK
我必須承認我不太清楚你的目標是在這裏......通常,生產者/消費者喜歡「生產者生產,而有空間和消費者消費,而有產品」... 你知道如何處理共享記憶? –
再次感謝您的回覆。 @ http://www.cs.cf.ac.uk/Dave/C/node27:什麼我需要一個例子可以在「shm_server.c,shm_client.c實施例兩個進程通過共享存儲器comunicating」中找到。 html#SECTION002730000000000000000 – viKK