2014-10-30 1 views
1

내 코드에 이상한 문제가 있습니다. 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); 
} 
+0

을 작성하는 방법은 ... -1과 1 추가하거나 세마포어에 빼기 값입니다. 어디로 패스? 0 ... 여기 그것을 시도 : sops = {semid, -1, 1}; ---> sops = {0, -1, 1}; –

답변

0

이 세마포어 작업이 제대로 코드가 하나의 세마포어를 생성해야 할 모든 세 가지 프로세스에 대한 해당 세마포어를 사용합니다. 코드가 각 프로세스에 대해 별도의 세마포를 만드는 것으로 보입니다. 또한 세마포어를 만든 후 코드는 세마포어 값을 1로 초기화해야 세마포어를 사용할 수 있습니다. 여기

내가 현재 세마포어를 중지, 그들은 모두 idsem입니다 코드

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/sem.h> 

#define SEM_RA (SEM_R | SEM_A) 
#define SEM_FLAGS (SEM_RA | (SEM_RA >> 3) | (SEM_RA >> 6)) 
#define CICLOS 10 

static void error(const char *msg) 
{ 
    perror(msg); 
    exit(1); 
} 

void waitSem(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, -1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

void signalSem(int semid, int semnum) 
{ 
    struct sembuf operations = { semnum, 1, 0 }; 

    if (semop(semid, &operations, 1) < 0) 
     error(__func__); 
} 

void proceso(char *pais, int semID) 
{ 
    int k; 

    for (k = 0; k < CICLOS; k++) 
    { 
     waitSem(semID, 0); 
     // Entrada a la sección crítica 
     printf("Entra %s ", pais); 
     fflush(stdout); 
     sleep(arc4random_uniform(3)); // Espera aleatoria dentro de la sección crítica 
     printf("- %s Sale\n", pais); 
     signalSem(semID, 0); 
     // Salida de la sección crítica 
     sleep(arc4random_uniform(3)); // Espera aleatoria fuera de la sección crítica 
    } 

    exit(0); // Termina el proceso 
} 

char *paises[3] = { "Peru", "Bolivia", "Colombia" }; 

int main(void) 
{ 
    int i, semID, status; 
    pid_t pid; 

    // create the one semaphore that will be used by all three child processes 
    if ((semID = semget(0x1001, 1, IPC_CREAT | SEM_FLAGS)) < 0) 
     error("Unable to create semaphore"); 

    // set the semaphore count to 1 so it's ready to be taken 
    if (semctl(semID, 0, SETVAL, 1) < 0) 
     error("Unable to initialize semaphore"); 

    for (i = 0; i < 3; i++) 
    { 
     pid = fork();  // Crea un nuevo proceso hijo que ejecuta la función proceso() 
     if (pid == 0) 
      proceso(paises[i], semID); 
    } 

    for (i = 0; i < 3; i++) 
     wait(&status); 
} 
+0

도움을 주셔서 감사합니다 .... SEM_R 및 SEM_A는 컴파일 오류가 발생하기 때문에 무엇입니까? –

+0

이들은 에 정의되어 있습니다. '#define SEM_A 0200''#define SEM_R 0400' 그들은 8 진 상수이기 때문에 선행 0은 매우 중요합니다. – user3386109

+0

이것은 허가권 소유자입니까? 쓰기와 읽기를 원하십니까? (모든 도움을 미리 보내 주셔서 감사합니다.) –