내 코드에 이상한 문제가 있습니다. Linux 세마포어를 사용하여 3 개의 "열차"가 동시에 트랙에 진입하는 것을 방지합니다. 그래서 출력과 같이해야합니다 : Entra 페루 판매 페루 Entra 볼리비아 판매 볼리비아 Entra 콜롬비아 판매 콜롬비아 ... (10 회)끝 부분에서만 작동하는 세마포어
을 그리고 그것은 첫째, doesent 그 중 3을 입력하고 그 중 3 명은 나간다. 그러나 마지막주기에는 정상적으로 작동합니다. 그래서, 어떤 아이디어? Heres는 소스 코드 :
/*semaphore.h*/
struct sembuf {
ushort sem_num; /* semaphore index in array */
short sem_op; /* semaphore operation */
short sem_flg; /* operation flags */
};
int seminit(int idsem, int value){
int semid = semget(idsem, 1, IPC_CREAT);
return semid;
}
void semwait(int idsem){
int semid = semget(idsem, 0, IPC_EXCL);
struct sembuf sops={semid, -1, 1};
int op = semop (semid, sops, 1);
}
void semsignal(int idsem){
int semid = semget(idsem, 0, IPC_EXCL);
struct sembuf sops={semid, 1, 1};
int op = semop (semid,sops, 1);
}
그리고이 :
/*semaforos.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "semaphores.h"
#define CICLOS 10
char *pais[3]={"Peru","Bolivia","Colombia"};
int *g;
void proceso(int i)
{
int k;
int l;
int semid=seminit(i, -1);
printf("\nSEMID: %d\n",semid);
for(k=0;k<CICLOS;k++)
{
semwait(i);
//Entrada a la seccción crítica
printf("Entra %s\n",pais[i]);
fflush(stdout);
sleep(rand()%3);
printf("- %s Sale\n",pais[i]);
semsignal(i%3);
// Salida de la sección crítica
sleep(rand()%3); // Espera aleatoria fuera de la sección crítica
}
exit(0); // Termina el proceso
}
int main()
{
int pid;
int status;
int args[3];
int i;
srand(getpid());
for(i=0;i<3;i++)
{
pid=fork(); // Crea un nuevo proceso hijo que ejecuta la función proceso()
if(pid==0)
proceso(i);
}
for(i=0;i<3;i++)
pid = wait(&status);
}
을 작성하는 방법은 ... -1과 1 추가하거나 세마포어에 빼기 값입니다. 어디로 패스? 0 ... 여기 그것을 시도 : sops = {semid, -1, 1}; ---> sops = {0, -1, 1}; –