Понимание дочерних процессов unix, использующих семафор и разделяемую память

Я сделаю все возможное, чтобы задать этот вопрос с пониманием, которое у меня есть.

Я делаю задание по программированию (давайте сейчас просто об этом позаботимся), которое использует 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 места, которые я знаю, я буду в родителе. Но так как все дети должны быть созданы первыми, должно ли это быть последним условным условием после моего третьего форка, когда я знаю, что я родитель? Когда я использую свой тестовый метод, я получаю разбросанные выходные данные, то есть дочерний один может быть после выходных данных родителя, затем дочерний три и т. Д. Он никогда не находится в каком-либо порядке, и из того, что я понимаю относительно ожидаемого форка.

У меня действительно три вопроса, но мне нужно сначала обернуть голову вокруг структуры. Итак, позвольте мне попытаться сказать это снова кратко, без всякой ерунды, потому что я зациклен на размещении циклов и критических разделов, которые еще даже не написаны.

Точнее говоря, когда родитель знает о существовании всех дочерних элементов, и с этой структурой один ребенок может выполнить задание и каким-то образом вернуться к нему (т. Е. Сумматор / первый дочерний элемент, добавляющий глобальную переменную один раз, завершается, а другой дочерний элемент может делать свое дело так далее).

Я все еще чувствую, что я не спрашиваю правильную вещь, и я полагаю, что это связано с тем, что я все еще пытаюсь понять концепции. Надеюсь, мое заикание покажет то, на чем я застрял концептуально. Если нет, я могу уточнить.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]