关于Linux课程设计

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的大小。

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值