共享内存实例

源码

书上关于进程间通过共享内存实现通信的例子。

遇到了问题

操作过程中,一直提示 shmat error, 很纳闷。

解决

调试了很长时间,突然想起shmat会将错误原因存于error中,所以在源代码中加了一句
printf("%s\n", sys_errlist[errno]);
运行结果显示
Permission denied.
原来是没有权限,运行时 加上 sudo , OK。解决.

代码如下

m1.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

#define BUF_SIZE 1024
#define MYKEY 24

int main(int argc, char *argv[]) {
    int shmid;
    char *shmptr;
    
    if((shmid=shmget(MYKEY, BUF_SIZE, IPC_CREAT)) == -1) {
        fprintf(stderr, "shmget error!\n");
        exit(1);
    }

    printf("%d\n", shmid);

    if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) {
        printf("%s\n", sys_errlist[errno]);
        exit(1);
    }

    while(1) {
        printf("string:%s\n", shmptr);
        putchar('\n');
        sleep(2);
    }
    
    exit(0);
}
View Code

 

  

m2.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

#define BUF_SIZE 1024
#define MYKEY 24

int main(int argc, char *argv[]) {
    int shmid;
    char *shmptr;

    if((shmid=shmget(MYKEY, BUF_SIZE, IPC_CREAT)) == -1) {
        fprintf(stderr, "shmget ERROR!\n");
        exit(1);
    }

    if((shmptr=shmat(shmid, 0, 0)) == (void *)-1) {
        fprintf(stderr, "shmat error!\n");
        printf("%s\n", sys_errlist[errno]);
        exit(1);
    }

    while(1) {
        printf("input string:\n");
        scanf("%s", shmptr);
    }

    exit(0);
}
View Code

 

posted on 2013-08-22 15:17  Still_Raining  阅读(309)  评论(2编辑  收藏  举报