Я сделаю все возможное, чтобы задать этот вопрос с пониманием, которое у меня есть.
Я делаю задание по программированию (давайте сейчас просто об этом позаботимся), которое использует C или C ++ на Unix-сервере для разветвления четырех детей и использует семафор и разделяемую память для обновления глобальной переменной. Я не уверен, что у меня есть проблема, но мое непонимание заставляет меня подвергать сомнению свою структуру. Вот:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define NUM_REPEATS 10
#define SEM_KEY 1111
#define SHM_KEY 2222
int globalCounter = 0;
/***** Test function for confriming a process type ******/
int checkProcessType(const char *whoami)
{
printf("I am a %s. My pid is:%d my ppid is %d\n",
whoami, getpid(), getppid() );
for(int i = 1; i<=3; i++){
printf("%s counting %d\n", whoami, i);
}
return 1;
}
void
int main (void) {
pid_t process_id; // PID (child or zero)
int sharedMemID; // Shared memory ID
int sharedMemSize; // shared memory size
struct my_mem * sharedMemPointer; // pointer to the attached shared memory
// Definition of shared memory //
struct my_mem {
long counter;
int parent;
int child;
};
// Gathering size of shared memory in bytes //
sharedMemSize = sizeof(my_mem);
if(sharedMemSize <= 0){
perror("error collection shared memory size: Exiting...\n");
exit(0);
}
// Creating Shared Memory //
sharedMemID = shmget(SHM_KEY, sharedMemSize, 0666 | IPC_CREAT);
if (sharedMemID < 0) {
perror("Creating shared memory has failed: Exiting...");
exit(0);
}
// Attaching Shared Memory //
sharedMemPointer = (struct my_mem *)shmat(sharedMemID, NULL, 0);
if (sharedMemPointer == (struct my_mem*) -1) {
perror("Attaching shared memory has failed. Exiting...\n");
exit(0);
}
// Initializing Shared Memory //
sharedMemPointer->counter = 0;
sharedMemPointer->parent = 0;
sharedMemPointer->child = 0;
pid_t adder, reader1, reader2, reader3;
adder = fork();
if(adder > 0)
{
// In parent
reader1 = fork();
if(reader1 > 0)
{
// In parent
reader2 = fork();
if(reader2 > 0)
{
//In parent
reader3 = fork();
if (reader3 > 0)
{
//In parent
}
else if (reader3 < 0)
{
// Error
perror("fork() error");
}
else
{
// In reader3
}
}
else if(reader2 < 0)
{
//Error
perror("fork() error");
}
else
{
// In reader2
}
}
else if(reader1 < 0)
{
// Error
perror("fork() error");
}
else
{
// In reader1
}
}
else if(adder < 0 )
{
// Error
perror("fork() error");
}
else
{
// In adder
//LOOP here for global var in critical section
}}
Просто некоторая информация о том, что я делаю (я думаю), я создаю кусок общей памяти, которая будет содержать переменную, давайте вызовем ее counter
это будет строго обновляться adder
и родителем, который становится вычитателем после того, как все дочерние процессы активны. Я все еще пытаюсь разобраться с семафорами, которые я буду использовать, чтобы сумматор и вычитатель выполнялись в критической секции, но мой главный вопрос заключается в следующем.
Как я могу узнать, где я нахожусь в этой структуре? Мой сумматор должен иметь цикл, который будет выполнять некоторую работу (обновлять глобальную переменную), а родитель / вычитатель должен иметь цикл для своей работы (также обновлять глобальную переменную). И все readers
могу посмотреть в любое время. Имеет ли значение размещение цикла для родителя / вычитателя? У меня в основном есть 3 места, которые я знаю, я буду в родителе. Но так как все дети должны быть созданы первыми, должно ли это быть последним условным условием после моего третьего форка, когда я знаю, что я родитель? Когда я использую свой тестовый метод, я получаю разбросанные выходные данные, то есть дочерний один может быть после выходных данных родителя, затем дочерний три и т. Д. Он никогда не находится в каком-либо порядке, и из того, что я понимаю относительно ожидаемого форка.
У меня действительно три вопроса, но мне нужно сначала обернуть голову вокруг структуры. Итак, позвольте мне попытаться сказать это снова кратко, без всякой ерунды, потому что я зациклен на размещении циклов и критических разделов, которые еще даже не написаны.
Точнее говоря, когда родитель знает о существовании всех дочерних элементов, и с этой структурой один ребенок может выполнить задание и каким-то образом вернуться к нему (т. Е. Сумматор / первый дочерний элемент, добавляющий глобальную переменную один раз, завершается, а другой дочерний элемент может делать свое дело так далее).
Я все еще чувствую, что я не спрашиваю правильную вещь, и я полагаю, что это связано с тем, что я все еще пытаюсь понять концепции. Надеюсь, мое заикание покажет то, на чем я застрял концептуально. Если нет, я могу уточнить.
Задача ещё не решена.
Других решений пока нет …