我的代碼有一個奇怪的問題。假設使用Linux信號量防止3個「列車」同時進入軌道。所以輸出必須是這樣的: ENTRA祕魯 售祕魯 ENTRA玻利維亞 售玻利維亞 ENTRA哥倫比亞 出售哥倫比亞 ... (10次)信號量只在最後工作
它doesent,首先進入他們的3然後他們三個出去。但是,在最後一個週期它的工作原理應該如此。那麼,有什麼想法?繼承人的源代碼:
/*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,停止當前的信號... -1和1是添加或價值。減去的信號。通過零在哪裏?...我在這裏試過: sops = {semid,-1,1}; ---> sops = {0,-1,1}; 但它沒有工作): – 2014-10-31 00:05:34