C에서 명령 줄에 입력 된 숫자가 0에서 9로 계산되는 프로그램을 만들려고합니다.이 프로그램에서 총 3 개의 프로세스를 만드는 두 개의 fork() 호출이 있어야합니다. 그런 다음 각 프로세스가 다른 n % 3을 담당하는 숫자 순서로 실행되도록 최소 1 개의 세마포어를 사용해야합니다.내 세마포어가 분기 된 프로세스 내에서 순서가 잘못된 이벤트를 허용하는 이유는 무엇입니까?
문제점은 내가 사용하고있는 세마포어에도 불구하고, 프로그램이 상당히 규칙적으로 작동하지 않는 것 같습니다. 나는 현재 각 프로세스가 자신이 지정한 세마포어를 강제로 기다릴 게이트 스타일 시스템을 사용하고 있으며, 일단 끝나면 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;
}
난 당신이 세 번째 문장에 함축되어 있는지 확실하지 않습니다 내가 공유 변수를 사용하려면 아니면 개인을 사용하는 것을 사본. 나는 각각이 카운터 변수의 개별 사본을 액세스하고 있으며 이것이 세마포어 게이트의 목적이라는 것을 알고 있습니다. 스레드가 다시 실행될 수 있으면 두 프로세스가 모두 인쇄를 완료 했으므로 시퀀스의 다음 문자는 counter의 현재 값보다 3이 앞당겨집니다. – KM529