对于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)
}
IPCInter-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
再看看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)