我被要求将消费者(客户端)开发到生产者(服务器),生产者创建进程,等待消费者读取共享内存和删除的进程,然后将控制传回给生产者以杀死进程并关闭共享内存块。进程间通信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