Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C调用semget返回错误“;semget:没有这样的文件或目录;_C_Linux - Fatal编程技术网

C调用semget返回错误“;semget:没有这样的文件或目录;

C调用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,

我是一个C noob,试图创建一个使用semget(main.C的第一个if语句)的程序。我在linux机器上工作,写了一些涉及信号量的代码。当我运行我的程序时,它返回“semget:没有这样的文件或目录”。我没有包括carbon.c和hydrogen.c文件,但是如果有人认为它们对这个问题是必要的,我会把它们放上去。谢谢你的帮助

main.c
#包括“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
。如果信号量不存在,它将创建信号量。太棒了,谢谢。如果你将此作为答案发布,我可以接受itUse
semid=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;
}