面试题答案
一键面试- 创建共享内存
- 使用
shmget
函数。 - 函数原型:
int shmget(key_t key, size_t size, int shmflg);
- 参数意义:
key
:是一个键值,用于标识共享内存对象,通常使用ftok
函数生成。它就像共享内存的“名字”,不同进程通过相同的key
来访问同一共享内存。size
:指定共享内存的大小,以字节为单位。shmflg
:权限标志,如IPC_CREAT
表示如果共享内存不存在则创建,还可以与权限位(如0666
)进行按位或操作来设置共享内存的访问权限。
- 使用
- 将共享内存连接到进程地址空间
- 使用
shmat
函数。 - 函数原型:
void *shmat(int shmid, const void *shmaddr, int shmflg);
- 参数意义:
shmid
:是shmget
函数返回的共享内存标识符。shmaddr
:通常设为NULL
,表示让系统自动选择合适的地址将共享内存连接到进程地址空间。如果指定非NULL
地址,系统会尝试将共享内存连接到该地址,但不一定能成功。shmflg
:标志位,一般设为0
。如果设为SHM_RDONLY
,则以只读方式连接共享内存。
- 使用
- 进程间安全访问数据
- 可以使用信号量来实现同步。
- 例如创建信号量使用
semget
函数。 - 函数原型:
int semget(key_t key, int nsems, int semflg);
- 参数意义:
key
:与共享内存的key
类似,用于标识信号量集,通常与共享内存使用相同的ftok
生成的key
。nsems
:指定信号量集中信号量的个数。semflg
:与shmget
的shmflg
类似,用于指定创建标志和权限。
- 操作信号量使用
semop
函数。 - 函数原型:
int semop(int semid, struct sembuf *sops, unsigned nsops);
- 参数意义:
semid
:是semget
函数返回的信号量集标识符。sops
:是一个指向struct sembuf
结构数组的指针,struct sembuf
结构定义了对信号量的操作,如sem_num
指定操作哪个信号量,sem_op
指定操作值(如-1
表示等待信号量,1
表示释放信号量),sem_flg
指定操作标志。nsops
:指定struct sembuf
结构数组中元素的个数。
- 数据访问完成后
- 从进程地址空间分离共享内存,使用
shmdt
函数。 - 函数原型:
int shmdt(const void *shmaddr);
- 参数意义:
shmaddr
是shmat
函数返回的共享内存连接地址。 - 最后删除共享内存对象,使用
shmctl
函数。 - 函数原型:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
- 参数意义:
shmid
:共享内存标识符。cmd
:通常使用IPC_RMID
表示删除共享内存对象。buf
:一般设为NULL
。同样,对于信号量,使用完后也可以使用semctl
函数删除信号量集,其函数原型和参数意义与shmctl
类似,只是针对信号量相关操作。
- 从进程地址空间分离共享内存,使用