1.shm_open()和sem_open()都是系统调用函数
在Linux系统中,shm_open()函数用于创建或打开共享内存对象,sem_open()函数用于创建或打开信号量对象。这两个函数提供了在程序中操作共享内存和信号量的接口,允许应用程序通过系统调用与操作系统进行交互,从而实现对共享内存和信号量的管理和控制。
关于这两个函数的参数
下面的c语言语句创建了一个信号量
sem_t *semaphore = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0600, MAX_SEATS);
SEM_NAME是这个信号量的名字,一个字符串
O_CREAT | O_EXCL表示标志创建,表示如果信号量不存在,就创建它,如果信号量已经存在,则创建失败。
0600的作用是该信号量只有该进程能进行读写操作:
第一个数字为0,表示没有特殊权限。
第二个数字为6,表示所有者具有读写权限,用二进制表示为110。
第三个数字为0,表示所属组没有权限,用二进制表示为000。
第四个数字为0,表示其他人没有权限,用二进制表示为000。
下面的c语言语句创建了一个共享内存
int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0600);
SHM_NAME是一个字符串
O_CREAT | O_RDWR:打开共享内存对象的方式,其中O_CREAT表示打开或创建共享内存对象,O_RDWR表示可以读写该共享内存对象。
0600同上
2.ftruncate()函数
参数说明:
- fd:共享内存对象的文件描述符。
- MAX_SEATS * sizeof(Seat):希望设置的共享内存对象的大小,即最大座位数量乘以每个座位的大小.
ftruncate(fd, MAX_SEATS * sizeof(Seat));
通过这行代码,我们确保了共享内存对象的大小足够容纳最大座位数量的数据。
3.mmap()函数
参数说明:
- NULL:映射的地址,如果为NULL,则由内核自动选择。
- MAX_SEATS * sizeof(Seat):映射区域的大小,这里和上面的ftruncate()函数传入的大小相同。
- PROT_READ | PROT_WRITE:映射区域的保护标志,这里表示该区域既可读又可写。
- MAP_SHARED:映射区域的共享标志,这里表示该区域是共享的。
- fd:共享内存对象的文件描述符。
- 0:相对于共享内存对象起始地址的偏移量,这里设置为0。
Seat *seats = (Seat*)mmap(NULL, MAX_SEATS * sizeof(Seat), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); //Seat是一个结构体
通过这行代码,我们获得了一个指向共享内存对象的指针(seats),这个指针可以用作操作共享内存对象内存数据的入口。同时,我们也将共享内存对象映射到了当前进程的虚拟地址空间中,可以直接对它进行读写操作。
4.pthread_create()函数
参数说明:
- &threads[i]:指向线程ID的指针,用于获取新创建的线程ID。
- NULL:用于指定线程的属性,可以为NULL表示使用默认属性。
- reader_thread:函数指针,表示新线程要执行的函数。
- (void *)i:传递给reader_thread函数的参数,通过将i强制转换为void指针来传递给新线程。
通过这行代码,我们创建了一个新线程,并将其关联到特定的函数上运行。通过传递参数i给线程,可以在新线程中使用该参数进行特定的逻辑操作。
5.snprintf()函数
参数说明:
- seats[i].user_info:目标字符串数组,用于存储格式化后的字符串。
- sizeof(seats[i].user_info):目标字符串数组的大小,防止溢出。
- "%s":格式化字符串,表示将user_info的内容按字符串形式进行格式化。
- user_info:要格式化的源字符串。
通过这行代码,我们将user_info的内容按字符串形式格式化,并将结果复制到seats[i].user_info中。这样可以确保不会发生缓冲区溢出,同时确保复制的字符串不会超过seats[i].user_info的大小。