У меня странная проблема с моим кодом. Предполагается использовать 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);
}
Они оба являются idsem, чтобы остановить текущий семафор ... The -1 и 1, чтобы добавить или вычесть значение семафора. Пропустите ноль где? ... Я попробовал это здесь: sops = {semid, -1, 1}; ---> sops = {0, -1, 1}; Но это didint работа): –