【Linux进程间通讯】共享内存函数及用例的部分内容记录

关于共享内存函数与基本概念参考已有博客链接: link
此处对学习过程中的部分内容进行补充记录:

1、C语言中__FUNCTION__,FILE_和_LINE 的用法

C/C++提供了三个宏__FUNCTION__,_FILE_和_LINE_定位程序运行时的错误。程序预编译时预编译器将用所在的函数名,文件名和行号替换。当运行时错误产生后这三个宏分别能返回错误所在的函数,所在的文件名和所在的行号。
例程

//文件名字叫test.cpp,位于D:\test\下 
#include <stdio.h>
 
int main(int, char**)
 {
     printf("This fake error is in \"%s\" on line %d.\n", __FILE__, __LINE__);
     return 0;
 }
 
//运行结果
This fake error is in "C:\temp\test.cpp" on line 4.

2、open函数与close函数详解

基础内容
关于控制字的补充
一般的写法是if((fd=open(“/dev/ttys0”,O_RDWR | O_NOCTTY | O_NDELAY)<0){
perror(“open”);}这个事常用的一种用法fd是设备描述符,linux在操作硬件设备时,屏蔽了硬件的基本细节,只把硬件当做文件来进行操作,而所有的操作都是以open函数来开始,它用来获取fd,然后后期的其他操作全部控制fd来完成对硬件设备的实际操作。你要打开的/dev/ttyS0,代表的是串口1,也就是常说的com1,后面跟的是一些控制字。int open(const char pathname, int oflag, …/, mode_t mode * / ) ;这个就是open函数的公式。
控制字可以有多种,我现在给你列出来:
O_RDONLY 只读打开。
O_WRONLY 只写打开。
O_RDWR 读、写打开。
O_APPEND 每次写时都加到文件的尾端。
O_CREAT 若此文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明该新文件的存取许可权位。
O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作。
O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0。
O_NOCTTY 如果pathname指的是终端设备,则不将此设备分配作为此进程的控制终端。
O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I / O操作设置非阻塞方式。
O_SYNC 使每次write都等到物理I / O操作完成。
这些控制字都是通过“或”符号分开(|)
:open函数的函数原型为:

int open( const char * pathname, int flags);

int open( const char * pathname,int flags, mode_t mode);

当flags参数包含O_CREAT时,需要对mode参数进行指定

S_IRWXU,00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
第三个参数也可用八进制数字代替,比如0644表示-rw-r–r–

3、assert()函数详解

函数详解

  • 函数名:assert()
  • 原型:void assert( int expression )
  • 功能:如果形参为假则终止程序
  • 参数:真或假 注意:每个assert只能检查一个条件,如果多个条件不好判断是哪个条件的错误
  • 具体:如果形参数为假,assert 向 stderr打印一条出错信息,
    信息包含文件名、表达式、行号,然后调用abort终止程序
    如果形参为真,程序继续执行
  • 优点:可以方便我们进行程序调试,同时对于绝对不能出错(条件为假)的地方使用可以有效的预防出现更多的错误
  • 缺点:assert是宏函数,频繁的调用会增加额外的开销,影响程序性能
  • 禁用assert函数:在#include前面加上#define NDEBUG

4、shmid_ds结构

内核为每一个共享内存段维护着一个特殊的数据结构,就是shmid_ds,这个结构在include/linux/shm.h中定义
具体内容为:

struct shmid_ds{
      struct ipc_perm shm_perm;/* 操作权限*/
       int shm_segsz;                    /*段的大小(以字节为单位)*/
      time_t shm_atime;          /*最后一个进程附加到该段的时间*/
       time_t shm_dtime;          /*最后一个进程离开该段的时间*/
      time_t shm_ctime;          /*最后一个进程修改该段的时间*/
      unsigned short shm_cpid;   /*创建该段进程的pid*/
       unsigned short shm_lpid;   /*在该段上操作的最后1个进程的pid*/
       short shm_nattch;          /*当前附加到该段的进程的个数*/
/*下面是私有的*/
        unsigned short shm_npages;  /*段的大小(以页为单位)*/
      unsigned long *shm_pages;   /*指向frames->SHMMAX的指针数组*/
      struct vm_area_struct *attaches; /*对共享段的描述*/
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值