linux基础11 | IO函数
IO 函数文件基本操作
打开
读取
写入
关闭
需要引入如下头文件
12345#include <fcntl.h>#include <sys/stat.h>#include <sys/types.h>#include <unistd.h>
open123int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);
需要注意的是上面的函数实际上是通过多参数va_list实现的,C 库函数函数中没有函数重载。
const char * pathname
可以填写相对路径和绝对路径
int flags(常用
O_CREAT 当文件不存在创建。
O_RDONLY, 顾名思义,只读
O_WRONLY 只写
O_RDWR. 读写都有
O_APPEND 在文件末尾write添加
O_TRUNC 当文件不存在创建并清零。(常用在管道
O_CLOEXEC 是原子操作 ,当执行exec 自动关闭该文件描述符,防止E ...
linux基础12 | 文件和目录函数
LINUX 文件和目录函数与Linux 系统库函数 提供的open有些许不同,这次来讲解关于stdio.h C库种对文件的处理,但是本质上其实还是对open是进行的封装的。
从本院角度来看,两者的区别显而易见
open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
如果从文件IO的角度来看:
前者属于低级IO函数,
后者属于高级IO函数。
低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
再跨平台这一块,当然还是fopen 比较OK
这一系列函数一样也是
对文件进行操作
打开,关闭,创建,删除,拓展,压缩等。
fopen1234567#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);FILE *fdopen(int fd, co ...
linux基础10 | 进程控制函数补充
进程是操作系统调度的最小的单位进程的控制函数进程的控制函数大概可以这样分类
创建
fork
exec系
结束
正常,
意外,出现意外就需要对意外进行控制处理。
控制
保存环境。内存, 信号量等环境处理,响应。
信息
比如什么getpid之类的
结束后的处理。
创建创建进程提供了很多函数
最多的常用的EXEC 系列函数
不过EXEC 并不是真正的创建一个进程,exec会将 系统给当前进程分配的内存空间内存(用户区,比如什么.data段啦,.bss段啦之类的。替代码区等待),进行一个重新赋值替换,然而PCB 进程控制块区域不变(在系统内核区部分)
换核不换壳,该进程的pid ppid都不变
真正创建进程的这是fork函数。
EXEC系列123456789101112131415#include <unistd.h>extern char **environ;int execl(const char *pathname, const char *arg, ... /* (char *) NULL */);int execlp(c ...
linux基础09 | 权限控制函数
权限控制都说Linux之下皆文件。
linux 在访问文件时,根据不同的用户,组,文件所有者的来设定访问权限,保护文件安全
文件类型权限
分析
第0组
d 类型(文件夹
第一组 表示该文件的所有组权限
r read (代表值为4
w write (2
x 执行权限 (1
S 提权和降权
s 修改我当前的组
t 仅所有者可删除权限
第二组 同组用户的权限
第三组 其他人,公共权限
而数字为,硬链接数
在linux中常常使用chmod 修改文件的权限
获取用户在执行权限相关函数的第一步,
当然是需要知道当前有效的用户权限
有效用户识别码/有效组别
uid_t geteuid(void);
uid_t getgid(void);
真实用户识别码,/有效组别
uid_t getuid(void);
uid_t getgid(void);
有效用户表示的是这个进程启动时,是哪个用户启动的。
真实用户实际上就是这个进程实际上当下拥有的用户权限。
实际上我们尝尝用真实用户使用权限控制,而有效用户一般只是用来检测是否是,作为判断依据。
返回值为 0 表示 ROOT ...
linux基础01|格式化的输入输出
格式化输入输出printf 大伙太熟了这里就不细讲,给个表格自行查阅吧
符号
输出
%d
int 十进制
%u
unsinged 十进制
%l
long
%lld
long long
%f
float
%e
double 以指数形式
%s
char*
%g
较短的输出小数。
p
指针
x
十六进制
o
八进制
str print formatsprintf()
1int sprintf(char *str, const char *format, ...);
这玩意好用指出在于将数据整和,拼接到特定变量中, 或文件中(fprintf/fdprintf)。
为了安全起见防止数据溢出,建议使用snprintf() ,除非你很有把握
123 int snprintf(char *str, size_t size, const char *format, ...);//给定了size 放置溢出
by the way :
今天发现了一个坑,发现在赋值的时候当需要赋值超出类型限制的值时,需要进行强制转化,否则就会报错。编译 ...
linux基础03 | 字符处理
linux字符在linux中,字符处理 也提供C 库里的函数 。
首先当然是导入ctype.h头文件
判断常见的,
以下单纯给出了几个函数使用的代码示例,这里不再做过多介绍。
可以直接查找man文档进行查看。
1234567891011121314151617std::string str = {"hello world \r\n"};int i = 0;int length{str.length()};while (i != length) { if (isalnum(str[i])) std::cout << "A - " << str[i] << " "; if (isalpha(str[i])) std::cout << "a - " << str[i] << " "; if (isblank(str[i])) std::cout &l ...
linux基础07 | 同步与锁
同步啥事同步,同时起步,协调一致的,然而不同的对象,又有不同的同步概念
设备同步,两个设备之间的一个共同时间的参考,数据库同步等等
在linxu中我们需要了解线程同步
线程同步同步即协同一致,按照预订的先后次序运行
一个线程调用一个函数时,为了保证其他线程调用时的数据一致性,不能调用其他函数
这个时候我们就需要给这个调用的数据,上一个锁,对共享的区域做一个保护
所以在linux中当多个流程操作一个共享资源时都需要加锁
常用锁和常用原语互斥量(互斥锁)pthread_mutex_init初始化一个互斥锁
1int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
注意这个关键词restrict,指名只能使用该指针,不能通过其他指针操作内存指向
pthread_mutex_t *restrict mutex 可以单纯理解为锁 ,锁上是为0,解锁为1
mutex,const pthread_mutexattr_t *restrict attr 锁的属性 ...
linux基础06 | 时序竞态与守护进程
时序竞态CPU进程之间的竞争
pause函数调用该函数的进程主动挂起,等待任意信号唤醒,然后执行这个信号的默认行为,想要让这个程序继续运行就需要对这个信号进行捕捉,执行自定义的响应函数
代码示例
12345678910111213141516171819202122232425262728293031323334353637383940414243#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>#include<errno.h>void catch(int signo){ ;}unsigned int mysleep(unsigned int seconds){ int ret; struct sigaction act, oldact; act.sa_flags= 0; sigemptyset(&act.sa_mask); act.sa_handler ...