![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linuxC
文章平均质量分 69
barbyQAQ
这个作者很帅,什么都没留下…
展开
-
从read()系统调用浅谈错误处理
错误处理,是写出健壮程序重要的一关。良好的错误处理有助于发现bug、减少debug时间。也顺带地提高了我们的自信。如果你只是抱着“能跑就行”的态度,且从不检查返回值,大可不必继续阅读。下面分享个人的总结,包括书籍、他人建议对我的影响和启示。原创 2023-05-11 00:47:25 · 1060 阅读 · 0 评论 -
I/O多路复用概念
内核一旦发现进程指定的一个或多个I/O条件就绪(也就是说输入已经准备好被读取,或者描述符已能承接更多的输出),它就通知进程。——这个能力称为I/O复用(I/O multiplexing),是由select()和poll()这两个函数支持的。还有POSIX的变种pselect()。原创 2023-05-09 15:30:09 · 685 阅读 · 0 评论 -
处理多个/dev/input/eventX的情况
实在是太多了,十几二十个。而且每个人的电脑上鼠标、键盘对应的文件都不一样,可能插拔过后就变了。给我们写程序带来很大不便。原创 2023-05-09 05:26:51 · 1298 阅读 · 1 评论 -
linux input_event实现按键检测
关于Linux input子系统的概念,我也不太懂,会用就行了。原创 2023-05-09 04:15:13 · 2285 阅读 · 0 评论 -
linux检测按键
【代码】linux检测按键。原创 2023-05-09 02:16:46 · 715 阅读 · 0 评论 -
POSIX正则表达式
https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressionshttps://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions原创 2023-04-05 07:47:49 · 470 阅读 · 0 评论 -
POSIX条件变量 pthread_cond_t
posix_cond_t原创 2023-04-05 04:26:12 · 261 阅读 · 0 评论 -
extern “C“
c转载 2023-02-05 14:52:16 · 63 阅读 · 0 评论 -
解决需要手动设置LD_LIBRARY_PATH
解决需要手动设置LD_LIBRARY_PATH原创 2023-02-04 18:18:52 · 2715 阅读 · 0 评论 -
pthread_mutex_t互斥量
pthread_mutex_t原创 2022-11-05 16:05:05 · 890 阅读 · 0 评论 -
printf的%m妙用
内容: 记录printf格式化串选项中的一个不常用,但是挺有用的选项:%m作用:打印当前errno的原因实例:#include <stdio.h>#include <string.h>#include <errno.h>int main(){ printf("%m\n"); printf("strerrno = %s\n", strerror(errno)); //修改errno再查看%m会发生什么? printf("\n转载 2022-04-06 22:09:41 · 1572 阅读 · 0 评论 -
shell脚本自动生成makefile
源代码#!/bin/bashRED="\033[0;31m"GREEN="\033[0;32m"NONE="\033[0m"if [ $# != 1 ]then printf "${RED}Usage: automake <target.c>\n${NONE}" exit 0fimakefile="makefile"target=$(echo $1|sed 's/.c$//g')allCFiles=$(ls *.c)needCFiles="$(gcc -MM $原创 2022-04-04 21:56:59 · 1226 阅读 · 0 评论 -
21.目录与链接——系统调用
创建和移除(硬)链接:link()和unlink()#include <unistd.h>int link(const char *oldpath, const char *newpath); Returns 0 on success, or -1 on error.若oldpath中提供的是一个已经存在的文件的路径名,则系统调用link()将以newpath参数所指定的路径名创建一个新链接。若newpath指定的路径名已然存在,则不会将其覆盖;相反,将产生一个错误(EEXIST)原创 2022-03-03 20:57:34 · 694 阅读 · 0 评论 -
20.目录与链接——概念
目录和硬链接在文件系统中,目录的存储方式类似于普通文件,区别有:在目录的i-node条目中,会将其标记为一种不同的文件类型目录是经特殊组织而成的文件。本质上就是一个表格,包含文件名和i-node编号。进程能够打开一个目录,但却不能用read()去读取目录的内容。同样也不能使用write()来改变目录内容。仅能借助于open()、link()、mkdir()、symlink()、unlink()以及rmdir()之类的系统调用来间接改变其内容。i-node表的编号始于1,而非0,因为若目录条目的原创 2022-03-02 15:54:12 · 981 阅读 · 0 评论 -
19.文件属性
获取文件信息:stat()利用系统调用stat()、lstat()、以及fstat(),可获取与文件有关的信息,其中大部分提取自文件i节点。#include <sys/stat.h>int stat(const char *pathname, struct stat *statbuf);int lstat(const char *pathname, struct stat *statbuf);int fstat(int fd. struct stat *statbuf); All原创 2022-03-01 16:31:41 · 418 阅读 · 0 评论 -
18.文件系统
设备文件在内核中,每种设备类型都有与之相对应的设备驱动程序,用来处理设备的所有I/O请求。每个设备驱动程序所提供的接口一致。某些设备是实际存在的,如鼠标、键盘、磁盘、磁带。而另一些设备则是虚拟的,也就是不存在相应的硬件,但内核会(通过设备驱动程序)提供一种抽象设备。API与真实设备一样。设备分类设备分为以下两种类型:字符型设备基于每个字符来处理数据。终端和键盘都属于字符型设备。块设备。每次处理一块数据。块的大小取决于设备类型,但通常为512字节的倍数。磁盘和磁带设备都属于块设原创 2022-02-28 20:44:03 · 466 阅读 · 0 评论 -
17.文件I/O缓冲
简单来说就是系统调用和stdio I/O函数在操作磁盘文件时会对数据进行缓冲。因为磁盘读写太慢了,而内存更快。内核缓冲区高速缓存首先是系统调用,如write()和read(),在操作磁盘文件时不会直接发起磁盘访问,而是在用户空间缓冲区与内核缓冲区高速缓存之间赋值数据。内核会将内核缓冲区高速缓存中的数据与磁盘进行交换。控制内核缓冲区太难了太难了,还用不上。。。暂时放弃。。。stdio缓冲区而stdio 库也维护有自己的缓冲区,stdio缓冲区通过系统调用(write()、read())与内核.原创 2022-02-13 17:36:30 · 361 阅读 · 0 评论 -
16.系统和进程信息
/proc文件系统许多现代UNIX实现提供了一个/proc的虚拟文件系统。该文件爱你系统主流于/proc目录中,包含了各种用于展示内核信息的文件爱你,并且允许通过常规文件I/O来方便地读取,有时还可以修改这些信息。之所以称为虚拟,时因为其包含的文件和子目录并未存储于磁盘上,而是由内核在进程访问此类信息时,动态创建而成。以下是Linux专有的细节。获取与进程有关的信息:/proc/PID对于系统中每个进程,内核都提供了命名为/proc/PID(其中PID是进程的ID)的目录。此目录中的各种文件和子目原创 2022-02-13 17:34:43 · 659 阅读 · 0 评论 -
15.系统限制和选项
概念运行时恒定值运行时恒定值是指某一限制,若已经在<limits.h>中定义,则对于实现而言固定。但是该值是不确定的(因为该值可能依赖于可用的内存空间),因而在<limits.h>中会忽略其定义。这种情况可以使用sysconf()在运行时获取。运行时可增加值运行时可增加值是指某一限制,相对于特定实现其值固定,且运行此实现的所有系统至少都应支持这一最小值,然而,特定系统在运行时可能会增加这一最小值,可以使用sysconf()来获取系统所支持的实际值。路径名变量值路径名变量原创 2022-02-13 17:33:19 · 563 阅读 · 0 评论 -
14.进程时间
概念进程时间是进程创建后使用的CPU时间数量。处于记录的目的,内核把CPU时间分成以下两部分。用户CPU时间是在用户模式下执行所花费的时间数量,又是也称为虚拟时间(virtual time),这对于程序来说,是它已经得到CPU的时间。系统CPU时间是在内核模式中执行所花费的时间数量。这是内核用于执行系统调用或代表程序执行的其他任务所的时间。当我们运行一个shell程序,可以使用time(1)命令,来同时获取这两部分的时间和运行程序所需的实际时间。如:time ./a.outtimes()原创 2022-02-13 17:32:26 · 600 阅读 · 0 评论 -
13.时间转换函数
time_t转换为可打印格式1.ctime()#include <time.h>char *ctime(const time_t *timep); Returns pointer to statically allocated string terminated by newline and \0 on success, or NULL on error会返回一个长达26字节的字符串,内含标准格式的日期和时间,如:Thu Feb 10 23:11:07 2022该字符串包含换原创 2022-02-13 17:27:20 · 1315 阅读 · 0 评论 -
12.gettimeofday()和time()
gettimeofday()gettimeofday()可于tv指向的缓冲区中返回自Epoch(UTC 1970.1.1 00:00:00)以来的秒数,日期存储于time_t类型的变量,这是SUSv3定义的整数类型)#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone*tz); Returns 0 on success, or -1 on error参数tv是指向如下数据结构的一个指.原创 2022-02-13 17:24:59 · 701 阅读 · 0 评论 -
11.内存分配
brk()和sbrk()#include <unistd.h>int brk(void *end_data_segment); Returns 0 on success, or -1 on error.void *sbrk(intptr_t increment); Returns previous program break on success, or (void*)-1 on error这两个函数,目前的水平是没必要用,看看就行了。brk()设定program break(原创 2022-01-13 17:29:57 · 455 阅读 · 0 评论 -
10.setjmp()与longjmp()
文章目录函数原型功能工作流程原理示例标准限制原因滥用后果优化编译器的问题起因示例函数原型#include <setjmp.c>int setjmp(jmp_buf); Retuns 0 on initial call, nonzero on return longjmp()void longjmp(jmp_buf env, val);功能能够让函数从嵌套的函数中跳出,返回到函数的调用者之一(当前调用者或者调用者的调用者,等等)。工作流程setjmp()为后续的longjmp原创 2022-01-10 21:10:42 · 872 阅读 · 0 评论 -
9.环境列表
文章目录环境列表命令行访问环境变量添加与撤销补充显示从程序中访问环境可用的全局变量environ检索环境中的值getenv()使用时可移植性方面的注意事项修改环境putenv()扩展setenv()unsetenv()clearenv()clearenv()内存泄露问题程序访问示例environ为NULL的情况程序示例环境列表每一个进程都有与其相关的称之为环境列表(environment list)的字符串数组,或简称为环境(environment)。其中每个字符串都以名称=值(name=value)原创 2022-01-10 19:16:50 · 713 阅读 · 0 评论 -
8.进程内存布局
文章目录分布查看特殊情况示例代码扩展示例分布文本段包含进程运行的程序的机器语言指令。文本段具有只读属性,防止进程通过错误指针修改自身指令。因为多个进程可同时运行同一程序,所以将文本段设置为可共享。这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。初始化数据段包含显式初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件中读取这些变量的值。未初始化数据段包含了未进行显式初始化的全局变量和静态变量。程序启动之前,系统将本段内所有内存初始化为0.处于处于历史原因,此段常被称为BSS段原创 2022-01-09 21:27:32 · 345 阅读 · 0 评论 -
7.利用getopt()实现tee命令
前言上一篇解析了getopt()的用法,这一节就来实战一下,实现tee命令。而且这还是书上的练习题。纯净代码#include <stdio.h>#include <stdbool.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#include <unistd.h>#include <fcntl.h>#define BUF_SIZE 1原创 2022-01-09 11:28:25 · 467 阅读 · 0 评论 -
6.详解getopt()解析命令行选项
文章目录前言函数原型背景知识参数说明解析过程需要使用optind的情况getopt()返回-1,表示已到到选项列表结尾的情况getopt()错误出现错误的情况处理错误的规则报错归纳表总之就是实例解析GNU扩展标准手册GNU实现避免方法总之glibc的扩展和SUS标准比起来是会有一些bug的。补充结语前言getopt(),很好理解,字面意思就是get option。虽然挺好用,但是用法,刚看到真是让人头大,有点复杂。不过结合实际,也是能拿下的。函数原型#include <unistd.h>原创 2022-01-09 00:31:09 · 651 阅读 · 2 评论 -
5.mkstemp()和tmpfile()
函数原型#include <stdlib.h>int mkstemp(char* template); Returns file descriptor on success, or -1 on error#include <stdlib.h>FILE* tmpfile(void); Returns file pointer on success, or NULL on error作用mkstemp()会将随即文件名保存在template参数返回(这原创 2022-01-08 17:16:54 · 483 阅读 · 0 评论 -
4.truncate()和ftruncate()
文章目录函数原型头文件作用区别函数原型int truncate(const char* pathname. off_t length);int ftruncate(int fd, off_t length); Both returns 0 on success, or -1 on error头文件<unistd.h>作用将文件大小设置为length,丢弃超出部分,若小于参数length,则文件尾部添加一些列空字节或文件·空洞。区别truncate()指定路径文件名即可,不原创 2022-01-08 17:07:30 · 337 阅读 · 0 评论 -
3.分散输入和集中输出I/O:readv()和writev()
函数原型ssize_t readv(int fd, const struct iovec *iov, int iovcnt); Returns number of bytes read, 0 on EOF, or -1 on errorssize_t writev(int fd, const struct iovec *iov, int iovcnt); Returns number of bytes written, or -1 on error其中,iov中每个成员都是如下形原创 2022-01-08 15:03:13 · 285 阅读 · 0 评论 -
1.在文件特定偏移量处的I/O:pread()和pwrite()
文章目录函数原型功能函数原型ssize_t pread( int fd, void* buf, size_t count, off_t offset); Retrns number of bytes read, 0 on EOF, or -1 on errorssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); Returns number of bytes written, or -1 on e原创 2022-01-08 09:32:02 · 406 阅读 · 0 评论 -
2.详解size_t与ssize_t
文章目录ssize_t头文件类型作用POSIX手册原文归纳size_t头文件类型作用POSIX手册原文:归纳ssize_t头文件<sys/types.h>类型有符号整型作用字节数或(为负时)标识错误。由多个系统调用和库函数返回,作为指示错误的一种方式。如read()、write()ssize_t read(int fd, void *buf, size_t nbyte);ssize_t write(int fd, const char* buf, size_t nbyte);原创 2022-01-07 23:36:57 · 3244 阅读 · 0 评论