linux下共享内存允许的连接数有限制吗

linux下共享内存允许的连接数有限制吗,第1张

对于64位进程,同一进程可连接最多268435456个共享内存段;

对于32位进程,同一进程可连接最多11个共享内存段,除非使用扩展的shmat;

上述限制对于64位应用不会带来麻烦,因为可供连接的数量已经足够大了;但对于32位应用,却很容易带来意外的问题,因为最大的连接数量只有11个。

下面的例程test02.c演示了这个问题,为了精简代码,它反复连接的是同一个共享内存对象;实际上,无论所连接的共享内存对象是否相同,该限制制约的是连接次数:

#include <stdio.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#define MAX_ATTACH_NUM 15

void main(int argc, char* argv[])

{

key_t mem_key

longmem_id

void* mem_addr[MAX_ATTACH_NUM]

int i

if ( ( mem_key = ftok("/tmp/mykeyfile", 1) ) == (key_t)(-1) ) {

printf("Failed to generate shared memory access key, ERRNO=%d\n",

errno)

goto MOD_EXIT

}

if ( ( mem_id = shmget(mem_key, 256, IPC_CREAT) ) == (-1) ) {

printf("Failed to obtain shared memory ID, ERRNO=%d\n", errno)

goto MOD_EXIT

}

for ( i=1i<=MAX_ATTACH_NUMi++ ) {

if ( ( mem_addr[i] = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) )

printf("Failed to attach shared memory, times [%02d], errno:%d\n", i,

errno)

else

printf("Successfully attached shared memory, times [%02d]\n", i)

}

MOD_EXIT:

shmctl(mem_id, IPC_RMID, NULL)

}

IPC

Inter-Process

Communication

进程间通信。

UNIX进程间通信(IPC)方式包括:管道、FIFO、信号。

System

V进程间通信(IPC)包括:System

V消息队列、System

V信号灯、System

V共享内存。

Posix进程间通信(IPC)包括:Posix消息队列、Posix信号灯、Posix共享内存。

现在Linux中的进程通信主要有:管道(Pipe)、信号(Signal)、消息队列、共享内存、信号量、套接字(Socket)

*** 作系统上,以 root 执行

# /sbin/sysctl -a | grep sem

如果 /etc/sysctl.conf 中是

kernel.sem = 250 32000 100 128

(注意第四列 128)

则改为

kernel.sem = 250 32000 100 200

然后, /sbin/sysctl -p

再看看。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7382507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存