完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Linux高级编程(1)
Unix/Linux系统江湖传言:“文件之才,得之可得天下”,这也是采用文件系统管理硬件设备的原因。之前的linux基础篇主要是了解Linux的基础命令和工作原理;而高级篇涉及到Socket进程通信等重要的知识,话不多说,一起去挖宝吧! 下面提供百度思维导图的链接: 1.设备和文件 Linux采用文件系统管理硬件设备,我们可以把所有的硬件设备看做是特殊的文件,实现设备无关性。 (1)设备和文件操作方式: 系统API VS系统调用: 系统API:系统一般都有一个库libc ,程序员都是调用库文件来和内核打交道的 系统调用:操作系统提供给用户的特殊接口(实际上是以软中断的方式向内核请求)。 设备驱动程序会使用一些标准的内核服务,应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接;对文件的存取相当于对设备的使用;而我们知道设备驱动程序是内核的一部分(皇帝身边的红人),驱动必须要提供一个标准的接口(比如:我们最后阶段移植驱动的时候,一般都会加一个test.c文件,运行test.c实际上调用的也是驱动里面的接口函数),驱动模块调用read /write 操作 硬件; 文件描述符fd: PCB(进程管理块)中有文件描述符指针,记录的是每个进程的文件描述符列表,内核比较高傲,处于数据保护,不允许外人访问文件描述符表,只给外人提供一个文件描述符的ID而且还限制了访问的个数,这样 应用程序就可以通过这个文件描述符ID来访问内核的文件;通过#ulimit –n 来查看文件描述符; 当每个进程加载后,默认打开 0,1,2这三个文件描述符。 文件描述符如此好用,实乃居家旅行,杀人mei口,必备良药,那么问题来了,怎么获得这个文件描述符? 客官往下看: 基本文件操作: open/creat函数:(打开或者有可能创建一个文件) int open(constchar *pathname, int flags); int open(constchar *pathname, int flags, mode_t mode); int creat(constchar *pathname, mode_t mode); *creat(pathname, mode)等价于open(pathname,O_WRONLY|O_CREAT|O_TRUNC, mode) 返回值:成功时返回文件的描述符,失败时返回-1 eg: outfd= open(“myfile",O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP); close函数: #include int close(intfd); 返回值:成功则返回0,失败则返回1 read/write函数: #include ssize_t read(intfd, void *buf, size_t count); 返回值: 读到的字节数,若已到文件尾为0,若出错为-1 ssize_twrite(int fd, const void *buf, size_t count); 返回值: 若成功为已写的字节数,若出错为-1 fcntl函数:对指定的描述符对应的文件进行操作(经常用于文件锁) int fcntl(intfd, int cmd); int fcntl(intfd, int cmd, long arg); int fcntl(intfd, int cmd, struct flock *lock); 返回值: 若成功则依赖于cmd,若出错为-1 F_DUPFD: 用来查找大于或等于参数arg的最小且仍未使用的文件描述词,并且复制参数fd的文件描述词。 F_GETFD/F_SETFD:取得/设置close-on-exec旗标。 F_GETFL/F_SETFL:取得/设置文件描述词状态旗标 F_GETOWN/F_SETOWN:管理可用的I/O信号 F_GETLK/F_SETLK/F_SETLKW:取得/设置文件锁定的状态,后者若连接断开则直接错误返回 lseek函数:是用于在指定的文件描述符中将文件指针定位到相应的位置。 off_tlseek(int fildes, off_t offset, int whence); 返回值:如果成功则返回地址的偏移量,失败则返回-1 参数whence: SEEK_SET: 从文件开头计算偏移量 SEEK_CUR: 从文件当前的位置开始计算偏移量 SEEK_END: 从文件结尾的位置开始计算偏移量chmod修改权限:int chmod (char *pathname,mode_t mode) dup/dup2函数:复制文件描述符 *文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。 dup2可以让用户指定返回的文件描述符的值,如果需要,则首先接近newfd的值,他通常用来重新打开或者重定向一个文件描述符。 #include int dup(int oldfd); int dup2(int oldfd, int newfd); 返回值:成功则返回文件新的描述符,失败则返回-1 权限位设置为mode: int mkdir(char *pathname,mode_t mode) 文件记录锁:多个进程同时对同一文件进行操作,出现数据不同步,于是用fcntl函数对文件进行控制; 2.TTY和串口编程 TTY终端: 串行端口终端(/dev/ttySn); 伪终端(/dev/pty/); 控制终端(/dev/tty); 控制台终端(/dev/ttyn,/dev/console); 虚拟终端(/dev/pts/n); tty设备包括虚拟控制台,串口以及伪终端设备。 /dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。 串口编程: 在嵌入式中串口是字设备,访问具体的串行端口的编程与读/写文件的操作类似,只需打开相应的设备文件即可操作。串口编程在于参数与属性的设置。根文件中若没有串口设备文件,应使用mknod命令创建; eg: mknod /dev/ttyS0 c 3 23 (这个在开发板上移植驱动的时候使用过) 串口通讯方式: Ø 同步通讯:时钟保持一致; Ø 异步通讯:时钟频率可以不一样; Ø 全双工:收发同时进行; Ø 半双工:收发分开进行; 串口DB9针脚: RXD:接收 TXD:发送 GND:接地 其他(其他针脚可以做检测用): 举个栗子:如何查看串口设备有没有连接? 用RTS发送一个数据,看CTS有没有收到,这样就可以确定设备的连接状况。 串口设置: Ø 流控制:软件流和硬件流 Ø 波特率:传输速度 Ø 数据位:通常设8位 Ø 奇偶校验:校验数据 Ø 停止位:通常设1位 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4902 浏览 0 评论
87423 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4742 浏览 2 评论
3628 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2489 浏览 0 评论
2018浏览 3评论
1301浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1360浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1244浏览 0评论
1182浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 19:12 , Processed in 1.201763 second(s), Total 74, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号