gpt4 book ai didi

c - 命名信号量只是不工作

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:32 25 4
gpt4 key购买 nike

我们今天有考试,我们的任务是实现“火车处理程序”。

有 7 个序列,每个序列代表一个进程。每列火车在几秒钟后到达,检查我们的 3 条火车轨道中是否有一条可用。如果没有,请等待...如果轨道空闲,则输入并锁定。在火车站停留几秒钟,离开并解锁。

我和几个 friend 试图让我们的程序运行起来,但我们就是做不到。看来是我们的共享内存没有正确同步(信号量)的问题。使用 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;
}

最佳答案

用 -pthread 链接!!!!所有使用的信号量函数的手册页告诉我们 >.<

感谢大家的帮助!!

对于所有感兴趣的人,这是我现在的代码。我改进了很多我在考试中没有时间做的事情。这运行完美,在我的“初学者眼中”,使用给定的功能(信号量,共享内存......)无法改进。如果是,我将不胜感激提示和技巧;)

#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;
}

关于c - 命名信号量只是不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com