我的代码有一个奇怪的问题。假设使用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