Shmget不起作用 [英] shmget is not working

查看:23
本文介绍了Shmget不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <sys/shm.h>
int main() {
        int i=0;
        int shmid;
        int *mem=(int*)malloc(10*sizeof(int));
        key_t key;
        key=1234;
        pid_t pid;

        shmid=shmget(1234,sizeof(*mem), IPC_CREAT|0666);
        if(shmid==-1) {
             printf("shmget error
");
             return -1;
        }
        mem=shmat(shmid, NULL, 0);

        if(mem==(int*)-1) {
              printf("shmat error
");
              return -1;
        }

        for(;i<10;i++) {
               *(mem+i)=0;
        }

        pid=fork();

        if(pid<0) {
               fprintf(stderr,"Fork Failed");
               printf("array : ");
        }
        else if (pid==0) {
               printf("producer is created.
");
               printf("array : ");

               for(i=0;i<10;i++) {
                         printf("%d ", *(mem+i));
               }
               printf("
");
               for(i=0;i<10;i++) {
                      *(mem+i)=i+1;
               }
         }
         else {
                wait(NULL);
                printf("consumer takes control of array.
");
                printf("array : ");
               for(i=0;i<10;i++) {
                      printf("%d ", *(mem+i));
               }
               printf("
");
               printf("consumer is done.
");
               printf("array : ");
               for(i=0;i<10;i++) {
                            *(mem+i)=-1;
                            printf("%d ", *(mem+i));
               }
               printf("
done.");
        }
        free(mem);
       return 0;
}               
父进程和子进程共享一个数组。因此,我决定在这些进程之间共享内存。然而,shmget函数失败,这意味着如果我运行程序,打印值是shmget错误。我不知道问题出在哪里。我尝试了静态分配数组,动态分配数组等。有什么问题吗?我用的是Cygwin。

推荐答案

发自Cygwin's Implementation Notes

XSI IPC函数Semctl、Semget、Semop、shmat、shmctl、shmdt、shmget、msgctl、msgget、msgrcv和msgsnd仅在cygserver运行时可用。

有关Cygserver的更多信息,请点击此处:https://cygwin.com/cygwin-ug-net/using-cygserver.html

这篇关于Shmget不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆