进程间通信IPC-内存共享

函数:

(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。

(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数shmid所指向的共享内存与当前进程连接。当使用某共享内存时,需要先使用shmat,达成连接。

(3)int shmdt(const void *shmaddr),将先前用shmat连接的共享内存与当前进程解除连接。参数shmaddr为shmat返回的共享内存的地址。在完成对共享内存的使用后,需要使用shmdt解除连接。

(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的操作。当cmd为IPC_RMID时,删除shmid所指的共享内存。

实例:

file: shmshare.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/ipc.h>
#include<sys/shm.h>

int main(int argc, char* argv[])
{
        int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);
        if (shmid < 0)
        {
                perror("shmget");
                exit(EXIT_FAILURE);
        }
        printf("create shared memory OK, size = 1024, shmid = %d\n", shmid);

        char* buff = (char*)shmat(shmid, NULL, 0);
        if ((int)buff == -1)
        {
                perror("shmat");
                exit(EXIT_FAILURE);
        }
        memset(buff, 0, 1024);
        char temp[1024] = "";
        scanf("%s", temp);
        strncpy(buff, temp, 1024);

        shmctl(shmid, IPC_RMID, NULL);
        return 0;
}

file: shmshare2.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<assert.h>

int main(int argc, char* argv[])
{
        assert(argc == 2);
        int shmid = atoi(argv[1]);
        char* buff = (char*)shmat(shmid, NULL, 0);
        if ((int)buff == -1)
        {
                perror("shmat");
                exit(EXIT_FAILURE);
        }
        while(1)
        {
                if (buff[0])
                {
                        printf("buff:%s\n", buff);
                        break;
                }
        }
        shmdt(buff);
        return 0;
}

$gcc -Wall -o shmshare shmshare.c
$./shmshare
create shared memory OK, size = 1024, shmid = 229377
<wait for input>

$gcc -Wall -o shmshare2 shmshare2.c
$./shmshare2 229377
print <wait for input>

总结:共享内存是各种通信方式中效率最高的,但是也有一些问题,如多进程,多线程访问共享内存时同步问题。各种通信方式大同小易,原理都差不多,都是由系统提供支持的通信方式。从消息队列信号量可以看出,这系列POSIX IPC的方式是类似,查看man手册可以了解到更多的用法。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。