- 博客(49)
- 收藏
- 关注
原创 文件控制的内核表达
在同一个进程中,如果多次使用open打开同一个文件,每次调用open都会返回一个新的文件描述符。这些文件描述符是相互独立的,每个都有自己的文件读写位置等状态。修改其中一个文件描述符的状态不会影响其他文件描述符。 在父子进程之间,如果调用fork创建子进程,子进程会继承父进程的文件描述符表。这意味着父子进程共享相同的文件描述符,包括相同的文件读写位置。如果一个进程修改了文件的读写位置,另一个进程也会受到影响。
2023-12-12 15:41:54
998
3
原创 不可重入函数
在并发编程中,可重入函数是更为理想的选择,因为它们可以安全地在多个任务或线程之间共享和调用,而不需要额外的同步措施。而可重入性关注的是函数的自身特性,即函数的执行不依赖于全局状态或共享资源,可以被中断和重入而不会引发问题。线程安全的实现通常要求采取适当的同步措施,如互斥锁、信号量或原子操作,以确保多个线程之间的数据访问不会产生冲突。不可重入函数通常依赖于全局状态或共享资源,这使得多个任务或线程之间的并发访问可能会导致竞态条件或数据竞争。,因为线程安全的函数可能仍然依赖于全局状态或共享资源。
2023-11-28 18:41:55
1034
原创 Linux进程控制
在调用进程内部执行一个可执行文件。exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。exec 函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段、据段和堆栈等都已经被新的内容取代,只留下进程ID 等一些表面上的信息仍保持原样;只有调用失败了才会返回 -1并从原程序的调用点接着往下执行。调用exec 函数族并不是新建一个进程而是只替换用户区的数据在 UNIX 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的。
2023-11-28 18:14:59
1141
原创 Linux文件IO
每个标准 C 库的 IO 函数都带有缓冲区注意:一个文件可以打开多次,但是每次打开的文件描述符不同。后面介绍的函数均为Linux系统IO函数。作用:打开一个已经存在的文件参数:返回值:如果成功返回一个新的文件描述符,如果失败返回-1作用:读取指定文件参数:返回值:如果成功大于0返回实际读取到的字节数,等于0表示文件已经读取完毕;如果失败返回-1并设置errno作用:写入指定文件参数:返回值:如果成功大于0返回实际读取到的字节数,等于0表示没有任何内容写入文件;如果失败返回-1并设置errno 1.移动文件
2023-11-15 22:06:29
120
原创 Linux系统编程
◼ 库文件是计算机上的一类文件,提供给使用 者一些可以直接拿来用的变量、函数或类。◼ 库文件是特殊的一种程序,不能单独运行,可以简单的把库文件看成一种代码仓库。静态库在程序的链接阶段被复制 到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加 载到内存中供程序调用。◼ 库的好处:1.代码保密 2.方便部署和分发Makefile 是一种用于管理和自动化软件项目编译、构建和部署过程的文本文件。
2023-11-15 21:58:50
75
原创 简述树状数组
对于大小为nnn的序列numsnumsnums,最基本的树状数组以OlognO(logn)Ologn时间复杂度同时支持如下两种操作。更新numsnumsnums中单个元素的值,即单点修改。求numsnumsnums任意区间的元素值之和,即区间查询。无论使用普通数组还是利用前缀和数组,对于上述两种操作,均有一种的时间复杂度为OnO(n)On。而树状数组通过维护一个与numsnumsnums。
2023-11-15 21:50:11
63
原创 有名管道实现简单版聊天功能
它会检查是否有重复的用户名,如果没有则将用户信息添加到`users`数组中,并向客户端返回注册结果。处理注册请求:从注册FIFO中读取用户名、密码和用户私有FIFO名称,然后调用`register_user`函数来处理注册逻辑。2. 定义用户结构体,用于存储用户信息,包括用户名、密码、登录状态和用户私有FIFO名称。8. 发送消息:客户端输入接收者和消息,然后将消息发送给服务器,服务器会将消息传递给接收者的私有FIFO。2. 定义客户端私有FIFO名称`myfifo`,该名称基于客户端的用户名和进程ID。
2023-11-14 23:43:26
129
原创 C++iota()函数
c++11新增的函数,向指定容器范围填充一连串增值序列。用它通过指定一个起始值,并根据区间的长度递增生成后续的值。它有助于快速生成递增的序列。本质上就是按序访问迭代器,同时value++的写法。C++标准程序库的算法需要导入头文件一些数值类算法函数需要导入和last是迭代器,表示要填充的区间的起始位置和结束位置。value是起始值,该值将根据区间的长度逐步增加。无返回值。
2023-11-01 22:53:11
754
原创 C++stringstream类
的构造函数有很多,这里列举最为常用的两个构造函数:两种方式都可以创建对象,但创建后的对象用法不一样。利用第一种构造函数创建对象时,输入字符串后直接进行字符串拼接,推荐使用第一种。可以将存储于内部的字符串输出,需要调用str()
2023-11-01 22:38:50
183
原创 Visual Studio中文乱码问题
函数将控制台的输出编码设置为 UTF-8。在 Linux 下,控制台默认使用 UTF-8 编码,因此无需进行额外的设置。不修改文件的编码, 而是直接指定程序执行时使用的编码, 使其和运行程序的控制台的编码一致.SetConsoleOutputCP用于设置控制台程序输出字符集的语言。新版本的vs可能在“文件”隐藏了高级保持选项,可搜索重新如何打开。修改源代码文件的”编码格式”, 使其和控制台的编码格式保持一致。文件--->高级保存选项--->选择编码。在 Windows 下,使用。在代码中添加下面的代码。
2023-10-26 17:32:11
15875
2
原创 Linux kill 、kill -15、kill -9 的区别
信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应),也就是说,,两个命令在Linux中都有杀死进程的效果,然而两命令的执行过程却大有不同,在程序中如果用错了,可能会造成莫名其妙的现象。
2023-10-10 22:30:33
7084
原创 关于fork多进程中printf的问题
父进程(P0),子进程(P1),子进程(P2),子进程(P3),子进程(P4),子进程(P5),子进程(P6),子进程(P7),子进程(P8),子进程(P9),子进程(P10),子进程(P11),子进程(P12),子进程(P13),子进程(P14),子进程(P15):退出while循环,打印。子进程(P1):进入while循环,创建子进程(P5),子进程(P2):进入while循环,创建子进程(P6),子进程(P3):进入while循环,创建子进程(P7),
2023-10-10 14:50:09
261
原创 C++ stoi(),atoi() ,to_string()
stoi(),atoi() ,to_string 这三个函数都是对字符串处理的函数,前两者是将字符串转化为十进制 int 类型,最后一个是将十进制类型 int、double 等转化为string。因为在c语言中没有string类型,必须通过string类对象的成员函数 c_str() 把 string 转换成c中的字符串样式。对转化后的数进行检查,判断是否会超出 int 范围,如果超出范围就会报错;对转化后的数进行检查,超出上界,输出上界,超出下界,输出下界;进行转化的话,就需要。
2023-10-10 12:26:43
413
原创 二分查找总结
三种区间:闭区间 [ ]开区间 ( )半闭半开区间 [ ),( ]例题:返回有序数组中第一个 ≥ 8的数的位置。如果所有数都 <8,返回数组长度。闭区间 [ ]做法L = 0R = n - 1。
2023-09-07 16:30:24
98
原创 基于VSCode的Python虚拟环境搭建
由于工程项目的需要,往往对Python版本及其第三方库版本都有适配的要求,在管理多个工程时,就需要多个开发环境。venv模块在python3.3以上的版本可以使用,而virtualenv在python2.7+和python3.3+都可以使用,其中,venv在Python3.6中已默认安装,本文采用的是Python3.10。在命令行(terminal)中输入命令 python -m venv myvenv,创建Python虚拟环境文件夹 myvenv;在VSCode中创建Python工程文件夹;
2023-07-09 14:37:07
2568
原创 linux如何修改文件权限
直接修改文件目录的读、写、执行权限,但是不能精确到拥有者、组、其他、chmod +/-rwx 文件名目录名。chmod 在设置权限时,可以简单地使用三个数字分别对应 【拥有者 组 其他】用户的权限。chown,chgrp,chmod这三个命令分别修改不同的群体。常见数字组合有(u表示用户/g表示组/o表示其他)
2023-05-28 22:21:36
100
原创 SQL数据操作语言DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。
2023-03-14 22:04:41
115
原创 SQL数据查询语言DQL
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台都需要借助于数据库的分页操作。执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。判断条件不同:where不能对聚合函数进行判断,而having可以。模糊匹配(_匹配单个字符, %匹配任意个字符)在in之后的列表中的值,多选一。或者 (多个条件任意一个成立)
2023-03-14 22:03:41
391
原创 c++常用stl容器
1 vector1.1 说明vector是向量类型,可以容纳许多类型的数据,因此也被称为容器(可以理解为动态数组,是封装好了的类)进行vector操作前应添加头文件#include <vector>1.2 基本函数实现vector<int> v( N , i );建立一个可变长度数组v,内部元素类型为int,可变数组最初有N给元素,初始值为i,( N , i )可省略(默认为0)。1)v.push_back( a );将元素a插入数组v末尾,并增加数组长度。2)v
2022-05-26 23:04:17
809
原创 面向对象程序设计——运算符重载
运算符重载运算符重载的概念实质为运算符定义新的运算功能,使它除具备有原来系统规定的功能外,还具备新定义的功能。运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operator p(argument-list)//operator 后面的’p’为要重载的运算符符号。规则C++规定重载后的运算符的操作对象必须至少有一个是用户定义的类型(防止二义性)
2022-05-22 13:37:37
1278
原创 数据结构——并查集
并查集1. 概论定义:并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。主要构成:并查集主要由一个整型数组pre[ ]和两个函数**find( )、join( )**构成。数组 pre[ ] 记录了每个点的前驱节点是谁,函数 find(x) 用于查找指定节点 x 属于哪个集合,函数 join(x,y) 用于合并两个节点 x 和 y 。作用:并查集的主要作用是求连通分支数(如果一个图
2022-05-12 16:41:39
228
原创 二叉树的三种遍历方式
二叉树的三种遍历方式先序遍历:按照根节点->左子树->右子树的顺序访问二叉树中序遍历:按照左子树->根节点->右子树的顺序访问后序遍历:按照左子树->右子树–>根节点的顺序访问已知先序,中序,求后序#include<iostream>#include<cstring> using namespace std;string a,b;void work(int al,int ar,int bl,int br){ int
2022-05-12 16:39:42
394
原创 内联函数 —— C 中关键字 inline 用法解析
内联函数 —— C 中关键字 inline 用法解析一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。#include <stdio.h>
2022-05-08 18:59:11
225
原创 面向对象程序设计——单链表
概念:正如这幅图中所表示的那样,单链表就是由可能不连续的数据所组合而成的数据结构。 其中每个数据分为两部分,一部分是数据存储的位置,称为数据域,另外指针所存储的地方,称为指针域。单链表节点定义structstruct node{ int data; //存储链表数据 node *next; //存储结点的地址 node(int e=0,node *nextval=nullpte):data(e),next(nextval
2022-05-08 18:55:43
763
原创 面向对象程序设计——继承
继承继承介绍继承是类的重要特性。A类继承B类,我称B类为“基类”,A为“子类”。A类继承了B类之后,A类就具有了B类的部分成员,具体得到了那些成员,这得由两个方面决定:- 继承方式- 基类成员的访问权限三种继承方式比较公有继承方式(public)- 基类的私有成员,子类不可以访问- 基类的保护成员,子类可以继承为自己的保护成员,在派生类可以访问,在外部不可以访问。- 基类的公有成员,子类可以继承为自己的公有成员。在派生类可以访问,在外部也可以访问。保护继承(protected)
2022-05-08 18:50:30
1111
1
原创 面向对象程序设计——结构
结构结构体与指针指向结构的指针*直接定义指针变量:student sp;也可以在定义结构体类型同时定义指向结构体的指针struct 结构体类型名{ 字段声明;}*指针变量名;通过指针使用结构体给结构体指针赋值,如:sp = &s1;结构体指针变量的引用(*指针).成员。例如:(*sp).name指针->成员。例如:sp->name->是所有运算符中优先级最高的,通常程序员习惯使用第二种方法通过指针动态分配结构体空间和申请普通的动态
2022-05-08 18:44:21
396
原创 面向对象程序设计——静态成员与友元
静态成员与友元静态成员变量 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,**静态数据成员也遵守public/protected/private访问规则。**同时,静态数据成员还具有以下特点:静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。静态数据成员可以成为成员函数的
2022-05-08 18:43:27
453
原创 面向对象程序设计——类和对象
类和对象类的构成语法:class 类名 { private : 私有成员函数或数据成员 public : 公有成员函数或数据成员 protected : 被保护成员函数或数据成员 };//注意这里的分号; //类成员函数的定义可以直接置于类定义中的花括号内。此时,成员函数将被缺省为按内联方式处理类定义常见的两种形式: 类定义形式1:类界面和类实现分开。类实现在类外描述类外的成员函数定义,我们一般使用如下格式:返回值 类名:
2022-05-08 17:29:20
1576
原创 面向对象程序设计——引用
引用1. 概论引用并非对象,相反的,它只是为一个已存在的对象所起的另外一个名字。引用必须进行初始化,定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的。为引用赋值,实际上是把值赋给了与引用绑定的对象;获取引用的值,实际上是获取了与引用绑定的对象的值;以引用对象作为初始值,实际上是以与引用绑定对象的作为初始值。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起;引用的基本数据类型必须与引用对象的基本数据类型一样。如下面代码所示。
2022-05-08 17:24:57
431
原创 面向对象程序设计——指针
指针指针和一维数组1. 指针指向一维数组,当数组名使用 &a[i+1]==a+i+1 a[i+1]==*(a+i+1)//数组求和int main(){ int a[]{1,4,2,7,13,32,21,48,16,30}; int size=sizeof(a)/sizeof(*a); int n,sum,*ip; for(sum=0,n=0;n<size;n++) //下标法
2022-05-08 17:21:06
571
原创 I/O流的常用控制符
使用控制符时,要在程序的头上加头文件iomanip.h1.强制显示小数点时,可用ios::showpoint2.在正数前加正号,用ios::showpos3.cin>>会过滤掉不可见字符(如:空格,回车,TAB 等)若不想略过空白字符,使用:cin>>noskipws>>n;注意控制符对后续输出的影响#include<iostream>#include<iomanip>using namespace...
2022-03-01 15:35:03
571
原创 大整数取模(记忆化数组)
方法同余定理若a=b+c,则a%d=(b%d+c%d)%d例题输入n,m。输出斐波那契数列第n项对m取模的值。 #include<iostream> #include<cstdio> typedef long long ll; using namespace std; int f[10000002];//记忆数组 int n,m,ans; int main(){ scanf("%d %d",&n,&m); fo..
2022-02-28 23:08:54
197
空空如也
vscode远程连接linux编写c程序的未定义标识符
2023-08-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人