命名信号量只是不工作

时间:2015-06-17 16:34:00

标签: c process synchronization semaphore shared-memory

我们今天参加了考试,我们有一项任务是实施“火车司机”。

每个过程由7个列车代表。每列火车在几秒钟后到达,检查我们的3个traintracks中有1个是否可用。如果没有,等等...... 如果曲目是免费的,请输入并锁定。 在火车站停留几秒钟,离开并解锁。

我和一些朋友正试图让我们的程序运行,但我们无法完成它。似乎问题是我们的共享内存未正确同步(信号量)。使用mac,所以我必须使用命名信号量。

编译:“gcc -Wall -Werror -std = gnu99 -lpthread process_trains.c -o test”

代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <time.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <errno.h>


sem_t *sem;
int *shm_ptr;



int *initShm (int size) {
    int shm_fd = 0;

    if((shm_fd = shm_open("/shm", O_CREAT | O_RDWR, 0777)) == -1) {
        perror("Error creating shared memory segment!");
    }

    if ((ftruncate(shm_fd, size)) == -1) {
        perror("Error sizing shared memory segment!");
    }

    return (int*) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
}


int trainAboutToArrive(int arrive, int stay, int Y){

    int Z=0;

    //Zug kommt in "arrive" Sekunden an
    sleep(arrive);

    while (shm_ptr[Z]!=0) {
        Z++;
        if(Z==3){
            Z=0;
        }
    }

    sem_wait(sem);
    shm_ptr[Z]=1;
    sem_post(sem);

    printf("Zug %d ist auf Gleis %d eingefahren\n", Y, 1+Z);

    //Zug hat einen Aufenthalt von "stay" Sekunden 
    sleep(stay);

    sem_wait(sem);
    shm_ptr[Z]=0;
    sem_post(sem);

    sem_close(sem);

    printf("Zug %d verlässt Gleis %d\n", Y, 1+Z);

    return EXIT_SUCCESS;
}

int main(int argc, char const *argv[]) {

    shm_unlink("shm");

    int i=0, tracks=3, trains=7, status;
    int arrival[]={0,0,3,2,5,4,2};
    int stay[]={2,3,7,2,1,4,3};

    off_t size = sizeof(int)*tracks;
    shm_ptr = initShm(size);

    if((sem = sem_open("/semap",O_CREAT,0644,1)) == SEM_FAILED) {
        perror("client sem_open");
    }

    for (i=0; i < tracks; i++) {
        shm_ptr[i]= 0;
    }

    pid_t pids[trains];

    for (i = 0; i < trains; i++) {
        pids[i] = fork();
        if(pids[i] == -1) {
            perror("Error creating train-process!!");
        } else if (pids[i] == 0) {
            trainAboutToArrive(arrival[i], stay[i], 1+i);
            exit(0);
        }else if (pids[i] > 0) {

        }
    }

    for(i=0; i < trains; i++){
        waitpid(pids[i], &status, 0);
    }
    shm_unlink("shm");

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

与-pthread链接!!!!所有使用的信号量函数的手册页告诉我们&gt;。&lt;

感谢大家的帮助!!

对于所有感兴趣的人,这是我现在的代码。我改进了许多我没有时间参加考试的事情。这完全适用于我的初学者眼睛&#34;这不是通过使用给定的函数(信号量,共享内存......)来改进的。如果是的话,我会感激提示&amp;技巧;)

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <errno.h>

int *shm_ptr;

int *initShm (off_t size) {

    int shm_fd = 0;

    if((shm_fd = shm_open("/shm", O_CREAT | O_RDWR, 0777)) == -1) {
        perror("Error creating shared memory segment!");
    }

    if ((ftruncate(shm_fd, size)) == -1) {
        perror("Error sizing shared memory segment!");
    }

    return (int*) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
}

void initSem(sem_t **plats) {

    if((plats[0] = sem_open("/one",O_CREAT,0644,1)) == SEM_FAILED) {
        perror("client sem_open");
    }
    if((plats[1] = sem_open("/two",O_CREAT,0644,1)) == SEM_FAILED) {
        perror("client sem_open");
    }
    if((plats[2] = sem_open("/three",O_CREAT,0644,1)) == SEM_FAILED) {
        perror("client sem_open");
    }
}


int trainAboutToArrive(int arrive, int stay, int train, sem_t **plats){

    srand(getpid());
    int platform = rand()%3;

    sleep(arrive);

    while (3) {
        sem_wait(plats[platform]);
        if(shm_ptr[platform]==0){
            shm_ptr[platform]=1;
            break;
        }
        sem_post(plats[platform]);

        platform = rand() % 3;
    }

    printf("Train %d enters platform %d\n", train, 1+platform);

    sleep(stay);

    shm_ptr[platform]=0;

    printf("Train %d leaves platform %d\n", train, 1+platform);

    sem_post(plats[platform]);
    sem_close(plats[platform]);

    return EXIT_SUCCESS;

}

int main(int argc, char const *argv[]) {

    shm_unlink("/shm");
    sem_unlink("/one");
    sem_unlink("/two");
    sem_unlink("/three");

    int i=0, tracks=3, trains=7, status;
    int arrival[]={0,0,3,2,5,4,2};
    int stay[]={2,3,7,2,1,4,3};
    sem_t *plats[3];

    off_t size = sizeof(int)*tracks;
    shm_ptr = initShm(size);
    initSem(plats);

    for (i=0; i < tracks; i++) {
        shm_ptr[i]= 0;
    }

    pid_t pids[trains];

    for (i = 0; i < trains; i++) {
        pids[i] = fork();
        if(pids[i] == -1) {
            perror("Error creating train-process!!");
        } else if (pids[i] == 0) {
            trainAboutToArrive(arrival[i], stay[i], 1+i, plats);
            exit(0);
        }else if (pids[i] > 0) {

        }
    }

    for(i=0; i < trains; i++){
        waitpid(pids[i], &status, 0);
    }

    shm_unlink("/shm");
    sem_unlink("/one");
    sem_unlink("/two");
    sem_unlink("/three");

    return EXIT_SUCCESS;
}