C调用semget返回错误“;semget:没有这样的文件或目录;
我是一个C noob,试图创建一个使用semget(main.C的第一个if语句)的程序。我在linux机器上工作,写了一些涉及信号量的代码。当我运行我的程序时,它返回“semget:没有这样的文件或目录”。我没有包括carbon.c和hydrogen.c文件,但是如果有人认为它们对这个问题是必要的,我会把它们放上去。谢谢你的帮助 main.cC调用semget返回错误“;semget:没有这样的文件或目录;,c,linux,C,Linux,我是一个C noob,试图创建一个使用semget(main.C的第一个if语句)的程序。我在linux机器上工作,写了一些涉及信号量的代码。当我运行我的程序时,它返回“semget:没有这样的文件或目录”。我没有包括carbon.c和hydrogen.c文件,但是如果有人认为它们对这个问题是必要的,我会把它们放上去。谢谢你的帮助 main.c #包括“main.h” 空隙氢(空隙)//执行氢 空隙碳(空隙)//碳纤维 int main(){ int-semid,shmid;//信号量内存id,
#包括“main.h”
空隙氢(空隙)//执行氢
空隙碳(空隙)//碳纤维
int main(){
int-semid,shmid;//信号量内存id,共享内存id
无符号短seminit[NUM_SEMS];//用于初始化信号量
struct common*shared;//指向共享数据结构的指针
union semun semctlarg;//用于初始化信号量
//获取信号量内存id
如果((semid=semget(SEMKEY,NUM_SEMS,0777))<0){
perror(“semget”);
退出(退出失败);
}
seminit[MUTEX]=1;//将互斥信号量计数初始化为1
seminit[SH]=0;//将hyrdrogen信号量计数初始化为0
seminit[SC]=0;//将碳信号量计数初始化为0
semctlarg.array=seminit;//设置控制数组
//应用初始化
if((semctl(semid,NUM_SEMS,SETALL,semctlarg))<0){
perror(“semctl”);
退出(退出失败);
}
//获取共享内存id
如果((shmid=shmget(SHMKEY,1*K,0777))<0){
佩罗尔(“shmget”);
退出(退出失败);
}
//检索指向共享数据结构的指针
if((共享=(结构公共*)shmat(shmid,0,0))<0){
佩罗尔(“shmat”);
退出(退出失败);
}
//初始化共享数据结构变量
共享->等待\u H=0;
共享->等待\u C=0;
int retVal;//用于检查fork()的返回值
//产生20个氢
对于(int i=0;i使用
semid=semget(SEMKEY,NUM_SEMS,IPC|u create | 0777
)
因此,如果信号量不存在,它将创建信号量。使用
semid=semget(SEMKEY,NUM_SEMS,IPC|u create | 0777
)
因此,如果信号量不存在,它将创建信号量。使用semid=semget(SEMKEY,NUM_-SEMS,IPC_-create | 0777
。如果信号量不存在,它将创建信号量。太棒了,谢谢。如果你将此作为答案发布,我可以接受itUsesemid=semget(SEMKEY,NUM_SEMS,IPC_create | 0777
。这样,如果信号量不存在,它将创建信号量。非常感谢。如果你将此作为答案发布,我可以接受
#include "main.h"
void hydrogen(void);//executes hydrogen.c
void carbon(void);//executes carbon.c
int main() {
int semid, shmid;//semaphore memory id, shared memory id
unsigned short seminit[NUM_SEMS];//used to initialize semaphores
struct common *shared;//pointer to shared data structure
union semun semctlarg;//used to initialize semaphores
//get semaphore memory id
if ((semid = semget(SEMKEY, NUM_SEMS, 0777)) < 0) {
perror("semget");
exit(EXIT_FAILURE);
}
seminit[MUTEX] = 1;//initialize mutex semaphore count to 1
seminit[SH] = 0;//initialize hyrdrogen semaphore count to 0
seminit[SC] = 0;//initialize carbon semaphore count to 0
semctlarg.array = seminit;//set control array
//apply initialization
if ((semctl(semid, NUM_SEMS, SETALL, semctlarg)) < 0) {
perror("semctl");
exit(EXIT_FAILURE);
}
//get shared memory id
if ((shmid = shmget(SHMKEY, 1*K, 0777)) < 0) {
perror("shmget");
exit(EXIT_FAILURE);
}
//retrieve pointer to shared data structure
if ((shared = (struct common *)shmat(shmid, 0, 0)) < 0) {
perror("shmat");
exit(EXIT_FAILURE);
}
//initialize shared data structure variables
shared->waiting_H = 0;
shared->waiting_C = 0;
int retVal;//used to check return value of fork()
// spawn 20 Hydrogens
for (int i=0; i<NUM_H; i++) {
if ((retVal = fork()) == 0) {
hydrogen();
fflush(stdout);
printf("New Hydrogen process created\n");
fflush(stdout);
} else if (retVal < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
}
// spawn 5 Carbons
for (int i=0; i<NUM_C; i++) {
if ((retVal = fork()) == 0) {
carbon();
fflush(stdout);
printf("New Hydrogen process created\n");
fflush(stdout);
} else if (retVal < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
}
//wait for all car processes to finish
for (int i = 0; i < 25; ++i) {
if (wait(0) < 0) {
perror("wait");
exit(EXIT_FAILURE);
}
}
printf("All atoms have crossed!\n");
//delete semaphores
if (semctl(semid, NUM_SEMS, IPC_RMID, 0) < 0) {
perror("semctl");
exit(EXIT_FAILURE);
}
//delete shared memory
if (shmctl(shmid, IPC_RMID, 0) < 0) {
perror("shmctl");
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
void carbon(void) {
execl("carbon", "carbon", 0);
perror("execl");
exit(EXIT_FAILURE);//if exec returns there was an error
}
void hydrogen(void) {
execl("hydrogen", "hydrogen", 0);
perror("execl");
exit(EXIT_FAILURE);//if exec returns there was an error
}
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/errno.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define SEMKEY 77
#define SHMKEY 77
#define NUM_SEMS 3
#define MUTEX 0
#define SH 1
#define SC 2
#define NUM_C 5
#define NUM_H 20
#define K 1024//used for shared memory creation
enum MoleculeName { Carbon, Hydrogen };
//used to initialize semaphores
union semun {
unsigned short *array;
};
//shared data structure among processes
struct common {
int waiting_C;
int waiting_H;
};
void semWait(int semid, int semaphore) {
struct sembuf psembuf;
psembuf.sem_op = -1;
psembuf.sem_flg = 0;
psembuf.sem_num = semaphore;
semop(semid,&psembuf,1);
return;
}
void semSignal(int semid, int semaphore) {
struct sembuf vsembuf;
vsembuf.sem_op = 1;
vsembuf.sem_flg = 0;
vsembuf.sem_num = semaphore;
semop(semid,&vsembuf,1);
return;
}