共享內存實例

源碼

書上關於進程間經過共享內存實現通訊的例子。ide

遇到了問題

操做過程當中,一直提示 shmat error, 很納悶。spa

解決

調試了很長時間,忽然想起shmat會將錯誤緣由存於error中,因此在源代碼中加了一句
printf("%s\n", sys_errlist[errno]);
運行結果顯示
Permission denied.
原來是沒有權限,運行時 加上 sudo , OK。解決.調試

代碼以下

m1.ccode

#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.cxml

#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
相關文章
相關標籤/搜索