Мне было предложено разработать сторону потребителя (клиента) производителю (серверу), где производитель создает процессы, ждет, пока потребитель не будет читать разделяемую память и удаленные процессы, а затем передает управление производителю для уничтожения процессов и выключения блока разделяемой памяти.Interprocess Communication fork() - Timing wait() и/или sleep()
Я исследовал разницу между сном и ожиданием, и понимаю, что как только вызывается 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 */
Благодаря кучу парней :)
Спасибо за ответ (и). Я не должен использовать трубы, а производитель и потребитель должны читать то, что находится в общей памяти, и в зависимости от установленного в памяти флага указателя выполняют свои различные задачи. Если вы хотите его увидеть, я могу приложить полный код производителя в моем ответе выше, поможет ли это? – viKK
Должен признаться, что я не совсем уверен, что ваша цель здесь ... Обычно производитель/потребитель идет, как «Производитель производит, пока есть место, а потребитель потребляет, пока есть продукты» ... Знаете ли вы, как обрабатывать общие Память? –
Спасибо за ответ, еще раз. Пример того, что мне нужно сделать, можно найти в разделе «Пример двух процессов, связанных через общую память: shm_server.c, shm_client.c» @ http://www.cs.cf.ac.uk/Dave/C/node27. html # SECTION002730000000000000000 – viKK