Я пытаюсь создать программу, которая считает от 0 до любого числа, введенного в командной строке в C. В этой программе должно быть два вызова fork(), что делает в общей сложности 3 процесса. Затем я должен использовать как минимум 1 семафор, чтобы гарантировать, что процессы выполняются в порядке номеров, каждый из которых отвечает за разные n % 3.
Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря на семафоры, которые я использую, программа довольно регулярно выходит из строя. В настоящее время я использую систему в стиле шлюза, в которой каждый процесс заставит свой собственный назначенный семафор ждать, а после завершения sem_post семафор процесса, который должен выполняться следующим. Я знаю, что это не самый красивый или логически эффективный способ сделать это, но я был уверен, что он сработает после моих первых двух разных попыток, которые столкнулись с той же проблемой.
Если кто-нибудь может дать мне какие-либо предложения относительно того, где я так ошибся, я был бы очень признателен.
Мой код ниже:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#define SEM_NAME1 "/sem1.mutex"
#define SEM_NAME2 "/sem2.mutex"
#define SEM_NAME3 "/sem3.mutex"
int main(int argc, char *argv[]) {
if(argc <= 1){
printf("No arguments were provided so there is no number to count to");
return 1;
}
// Create the 3 semaphores needed
sem_t *sem1;
sem_t *sem2;
sem_t *sem3;
//initialize to 0
sem1 = sem_open(SEM_NAME1, O_CREAT, O_RDWR, 0);
if (sem1==SEM_FAILED) {
printf("%s sem_open failed!", SEM_NAME1);
return (-1);
}
//initialize to 1
sem2 = sem_open(SEM_NAME2, O_CREAT, O_RDWR, 1);
if (sem2==SEM_FAILED) {
printf("%s sem_open failed!", SEM_NAME2);
return (-1);
}
//initialize to 1
sem3 = sem_open(SEM_NAME3, O_CREAT, O_RDWR, 1);
if (sem3==SEM_FAILED) {
printf("%s sem_open failed!", SEM_NAME3);
return (-1);
}
pid_t pid;
pid_t pid2;
pid = fork();
if(pid == 0){
pid2 = fork();
}
// Shared fork variables
int counter = 0;
int ranOnce = 0;
int max_num = atoi(argv[1]);
while(counter <= max_num){
if(pid > 0){
printf("%d",getpid());
if(ranOnce == 0){
counter += 1;
ranOnce = 1;
}
sem_wait(sem2);
printf(" %d \n", counter);
counter += 3;
sem_post(sem3);
}
else if(pid2 == 0){
printf("%d",getpid());
if(ranOnce == 0){
counter += 0;
ranOnce = 1;
}
sem_wait(sem1);
printf(" %d \n", counter);
counter += 3;
sem_post(sem2);
}
else{
printf("%d",getpid());
if(ranOnce == 0){
counter += 2;
ranOnce = 1;
}
sem_wait(sem3);
printf(" %d \n", counter);
counter += 3;
sem_post(sem1);
}
}
//sem_unlink(SEM_NAME1);
//sem_unlink(SEM_NAME2);
//sem_unlink(SEM_NAME3);
return 0;
}