linux进程间通信,使用共享内存方式

闲来没事给想要学习进程间使用共享内存通信的例子,共享内存的效率比消息队列、信号量都要高?为什么呢?

  (1)共享内存是运行在用户空间的,由应用程序控制。

  (2)消息队列和信号量都是把数据从一个进程用户空间复制到内核空间,然后再由内核控件复制到另外一个进程的用户空间。

 

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#define key 0x1234
#define size 512
#define PERM S_IRUSR|S_IWUSR
int main(void)
{
    int shmid=shmget(key,size,IPC_CREAT|PERM);
    char *shm=shmat(shmid,NULL,0);
    if(shmid==-1){
        perror("shmget");
        return -1;
    }
    if(fork()>0){
        int parent_id=getpid();
        fprintf(stdout,"----parent pid=%d------\n",parent_id);
        int status;
        while(1){
            char *p_shm=shmat(shmid,NULL,0);
            if(strncmp(p_shm,"end",3)==0){
                fprintf(stdout,"***recyle child =%d*****\n",wait(&status));
                break;
            }
            else {
                memset(p_shm,'\0',size);
            }
            printf("parent %d send:",parent_id);
            fgets(p_shm,size,stdin);
            sleep(1);
        }
    }
    else
    {
        while(1){
            char *c_shm=shmat(shmid,NULL,0);
            if(strlen(shm)>0){
                printf("child %d recv:%s",getpid(),c_shm);
            }
            if(strlen(shm)>0&&strncmp(shm,"end",3)==0){
                memcpy(shm,"end",3);
                break;
            }
            sleep(1);
        }
    }
    if(shmdt(shm)==-1){
        perror("shmdt");
        return -1;
    }
    if(shmctl(shmid,IPC_RMID,NULL)==-1){
        perror("shmctl");
        return -1;
    }
}

 

运行结果:

----parent pid=3477------
parent 3477 send:hello
child 3478 recv:hello
parent 3477 send:123456
child 3478 recv:123456
parent 3477 send:this a test
child 3478 recv:this a test
parent 3477 send:end
child 3478 recv:end
***recyle child =3478*****

 

你可能感兴趣的:(linux进程间通信,使用共享内存方式)