自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 《Linux C编程实战》笔记:共享内存

由于本人要考研了,播客可能不会再长更。这本《Linux C编程实战》其实也差不多完结了,还剩网络编程章节没有讲,我肯定是没时间讲了,可能考研失败了会回来继续。《Primer C++》的课后题还有第八章的存货,后续章节只能随缘更新。Qt部分真烂尾了,写Qt项目的注释实在太累了。最有可能更新的部分是力扣题讲解,因为写来准备复试上机。最后祝大家,也祝我一切顺利。

2024-03-02 14:35:15 964 1

原创 力扣207.课程表

我们知道拓扑排序可以用来判断是否有环路,不过仅仅是判断环路也可以直接用dfs,不需要完全写出拓扑排序,毕竟拓扑排序相比dfs还是更复杂一些。如果是有环图,可以自己试一下,最后图里会剩下环,因为环上所有节点的入度都不为0,因此不会入栈。从0出发,进行一次dfs,假设路径是0-1-3-4,那么最后1,3,4会变成红色,0还是蓝色。最终,4个节点全部入了栈,因此cnt==n成立,该图是无环有向图。一开始只有0的度为0,所以0入栈,出栈时会执行这一段代码。那么就把从0开始的弧都删掉,并把弧所指向的节点的入度减1。

2024-04-08 15:37:02 381 1

原创 力扣323.无向图中连通分量的数目(dfs/bfs)

失败版,这是我最开始写出来的bfs代码,不过超时了,原因应该是遍历edges太费时了,因为edges存的时候是无序的,要找到我需要的节点就要遍历整个容器。所以改进的话就再建个邻接矩阵,这样找临边就方便许多。这道题按理说是一眼并查集的,不过深搜广搜也可以做。所以dfs也得加邻接矩阵。

2024-03-17 11:36:38 356

原创 《Primer C++》第五版习题:第八章

cin流的状态处于错误,比如eofbit,badbit,failbit。记得保存好自己的Sales_data,因为这本书可惦记这个类了。因为需要的是一个聚合类,所以不应该使用类内初始化。因为我们不会修改它们,所以定义成const。

2024-03-04 17:09:39 281

原创 《Primer C++》第五版习题:第七章

如果不加引用,第一次对myScreen的操作其实是对其一个副本的操作,myScreen的内容并没有改变,所以两次显示的内容不同且第二次display的还是原来myScreen的内容。:静态成员与类的实例无关,它们与类本身密切相关。友元能够访问被声明为私有的类成员,这在某些特殊情况下是有用的,例如提供更高效的实现或解决特定的设计问题。:静态成员被类的所有实例共享,因此它们可以用来表示属于类的数据或状态,而不是特定于类的实例。:静态成员的生命周期与程序的生命周期相同,而普通成员的生命周期与所属的类的实例相关。

2024-02-26 16:54:26 915

原创 《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍,这里就只写书上说的了。信号量是一个计数器,常用于处理进程或线程的同步问题,特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源,这里的资源可以是一段代码、一个变量或某种硬件资源。信号量的值大于或等于0时表示可供并发进程使用的资源实体数;小于0时代表正在等待使用临界资源的进程数。与消息队列类似,Linux内核也为每个信号量集维护了一个semid_ds数据结构示例。该结构定义在头文件linux/sem.h中。

2024-02-23 19:58:25 899

原创 《Linux C编程实战》笔记:消息队列

消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。与管道不同的是消息队列存放在内核中,只有在内核重启(即操作系统重启)或显示地删除一个消息队列时,该消息队列才会被真正的删除。操作消息队列时,需要用到一些数据结构,熟悉这些数据结构是掌握消息队列的关键。下面介绍几个重要的数据结构。

2024-02-21 21:52:40 709

原创 《Linux C编程实战》笔记:有名管道

管道的一个问题就是没有名字,因此只能用于有亲缘关系的进程间通信。有名管道(named pipe或FIFO)它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。有名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。Linux下有两种方法创建有名管道。一是在Shell下交互地建立一个有名管道。或者是在程序里用函数。

2024-02-03 13:44:54 493

原创 《Linux C编程实战》笔记:管道

从这节开始涉及进程间的通信,本节是管道。管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称之为半双工管道。。管道的这一特点决定了其使用的局限性。除了以上局限性,管道还有一些不足。例如管道没有名字,管道的缓冲区大小是受限制的,管道所传送的是无格式的字节流。这就要求管道的输入方和输出方事先约定好数据的格式。虽然有这么多不足,但对于一些简单的进程间的通信,管道还是可以胜任的。使用管道进行通信时,两端的进程向管道读写数据是通过创建管道时,系统设置的文件描述符进行的。

2024-01-29 17:11:43 1112

原创 《Linux C编程实战》笔记:信号应用于事件通知

第二种:用pause挂起,等待信号的触发,事件发生时向进程发送信号,对应的信号处理函数改变全局变量的值,信号处理函数返回后进程检测该全局变量,满足要求即可直到事件已发生。实际应用中,进程可能需要等待某一事件的发生,一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。第一种:程序不停循环检测全局变量,这样可以满足要求,但是非常占用cpu资源。第三种:原理和第二种一致,不过使用的函数是sigsuspend。

2024-01-27 15:56:13 285

原创 《Linux C编程实战》笔记:信号的发送与处理实例

我已经演示过使用sigqueue发送数据了。本节是书上使用sigqueue发送数据的例子。本节只有代码演示和讲解。演示如何利用信号来实现数据的传递,不过在。那么直接看代码吧,首先是发送方的程序。

2024-01-26 17:50:08 236

原创 《Linux C编程实战》笔记:信号的屏蔽

在的sigaction的sa_mask成员,它的类型就是一个信号集,下面我们来介绍它。

2024-01-25 15:19:28 861

原创 《Primer C++》第五版习题:第三章

如果写成for(char &c:str)的话,结果是一样的;不过不加&只是char c,也就不是引用的话就不对了,这样的话str是没有变化的。getiline会读入空白字符,但是最后会把它丢弃,不会存到string里去。(c)正确,是一个字符串的容器,里面有10个元素,都是"null"我就不一个一个容器的输出了,写一个函数吧,把容器传过来然后就输出。不合法,ivec是一个空的容器,还没有第一个元素。后面的内容都是C里面的数组了,我的评价是略过。(g) 10个"hi"字符串。(a)正确,是一个空的容器。

2024-01-24 19:20:32 372

原创 《Linux C编程实战》笔记:信号的发送

信号的发送主要由函数kill、raise、sigqueue、alarm、setitimer以及abort来完成。

2024-01-23 20:20:32 978

原创 《Linux C编程实战》笔记:信号处理函数的返回

信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从处理程序返回。

2024-01-21 13:41:44 1053

原创 《Linux C编程实战》笔记:信号的捕捉和处理

Linux系统中对信号的处理主要由signal和sigaction函数来完成,另外还会介绍一个函数pause,它可以用来相应任何信号,不过不做任何处理。

2024-01-20 20:12:01 998

原创 《Linux C编程实战》笔记:Linux信号介绍

信号是一种软件中断,它提供了处理一种异步事件的方法,也是进程惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展的信号机制,不仅可以用来通知某进程发生了什么事,还可以给进程传递数据。

2024-01-19 17:15:23 939

原创 《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章,按理说应该在前面就讲了头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误的信息程序开始执行时,变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用,errno的值可能不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一 个函数执行是否成功。

2024-01-17 18:54:32 1234

原创 《Linux C编程实战》笔记:线程同步

这一节主要是解决共享资源的处理。操作系统里也讲过互斥、锁之类的概念。

2024-01-13 16:59:51 1027

原创 《Linux C编程实战》笔记:线程私有数据

在多线程环境下,进程内的所有线程共享进程的数据空间,因此全局变量为所有线程共有。在程序设计中有时需要保存线程自己的全局变量,这种特殊的变量仅在某个线程内部有效。如常见的变量errno,它返回标准的出错代码。errno不应该是一个局部变量,几乎每个函数都应该可以访问它;但它又不能作为是一个全局变量,否则在一个线程 里输出的很可能是另一个线程的出错信息,这个问题可以通过创建线程的私有数据(Thread-specific Data,或TSD)来解决。

2024-01-10 15:19:23 447

原创 《Linux C编程实战》笔记:线程终止

Linux 下有两种方式可以使线程终止,一种是通过return从线程函数返回,第二种是通过调用pthread_exit()使线程退出是一个线程库中的函数,用于终止调用线程。调用将会终止当前线程,并将retval的值传递给等待该线程的任何调用的线程。如果线程没有被任何其他线程等待,它的资源将会在终止时被释放。有两种特殊情况要注意:一种情况是, 在主线程中,如果从main函数返回或是调用了exit函数退出主线程,则整个进程将终止,此时进程中所有线程也将终止,因此在主线程中不能过早地从main函数返回。

2024-01-09 15:12:03 509

原创 《Linux C编程实战》笔记:创建线程

上一章是进程,这一章是线程有关线程进程的概念之类的请自行学操作系统吧,书里都是偏实战应用的。

2024-01-04 23:31:56 1047

原创 《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活这次是自己的shell命令程序的示例。

2024-01-03 18:51:05 1163

原创 并行版的std::accumulate

是 C++ 标准库中的一个函数,用于获取计算机硬件支持的并发线程数目。类型的值,表示硬件支持的并发线程数,如果无法检测则返回 0。代码来自C++并发编程实战。

2023-12-20 22:14:33 397

原创 《Linux C编程实战》笔记:进程操作之ID,优先级

这个函数都用了很多次了,看一下定义和例子就行了。

2023-12-20 11:05:55 859

原创 std::mem_fn函数

头文件中提供的函数模板,用于生成成员函数的函数对象。它允许将成员函数包装成可调用对象,用于传递给标准库算法、函数对象、以及一些支持可调用对象的函数。不过在for_each里用处好像也没那么大,用lambda或bind也都行。如果本身成员函数本身有参数,就在使用时类对象后面加参数就行。得到一个可调用对象,这个可调用对象要怎么使呢?我遇到的用法是在for_each里做可调用对象。其中M是一个类,T是函数返回值类型。看模板根本看不懂好吧,看个例子。第一次遇到这个函数,记录一下。

2023-12-19 22:24:37 447

原创 《Linux C编程实战》笔记:进程操作之退出,执行,等待

进程退出表示进程即将运行结束。在Linux中退出分为正常退出和异常退出。退出方式比较父子进程终止的先后顺序不同会产生不同的结果。在子进程退出前父进程先退出,则系统会让 init进程接管子进程(前面有代码演示过)。当子进程先于父进程终止,而父进程又没有调用wait 函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。

2023-12-19 19:34:35 1411

原创 《Linux C编程实战》笔记:进程操作之创建进程

进程是一个动态的实体,是程序的一次执行过程。进程是操作系统资源分配的基本单位。以下是一些概念,我就直接抄书了进程是操作系统的知识,简单理解的话,你写的代码运行起来算一个进程?

2023-12-18 11:30:40 943

原创 《Linux C编程实战》笔记:实现自己的ls命令

函数功能:为显示某个目录下的文件做准备,参数flag_param用于在调用display函数时作为其参数flag的实参,path是要显示的目录。运行程序时,如果啥都不跟,直接./a.out这种的话,argc默认为1,argv[0]是程序名字,如果后面带了参数,比如这样。含义分别为:文件的类型和访问权限,文件的链接数,文件的所有者,文件所有者所属的组,文件大小,文件创建的时间。那argc就是4,argv[1],argv[2],argv[3]存的是参数的字符串。是一个位运算的操作,用于检查给定文件的权限位。

2023-12-16 16:18:46 899

原创 力扣785.判断二分图

存在一个,图中有n个节点。其中每个节点都有一个介于0到n - 1之间的唯一编号。给你一个二维数组graph,其中graph[u]是一个节点数组,由节点u的邻接节点组成。形式上,对于graph[u]中的每个v,都存在一条位于节点u和节点v之间的无向边。graph[u]ugraph[u]vgraph[u]ugraph[v]uv定义:如果能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,就将这个图称为。如果图是二分图,返回true;否则,返回。

2023-12-15 21:23:12 998

原创 《Linux C编程实战》笔记:目录操作

mkdir创建一个新的空目录。空目录中会自动创建.和..目录项。所创建的目录的存取许可权由mode (mode &~umask)指定。新创建目录的uid(所有者)与创建该目录的进程的uid一致。如果父目录设置了st_gid位,则新创建的目录也设置st _gid位(目录被设置该位后,任何用户在此目录下创建的文件的组id与该目录的组id相同)。函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中。

2023-12-15 17:16:51 805

原创 《Linux C编程实战》笔记:文件的移动和删除

本节只有两个函数。

2023-12-14 16:13:09 511

原创 《Linux C编程实战》笔记:文件属性操作函数

在shell下直接使用ls就可以获得文件属性,但是在程序里应该怎么获得呢?file_namebuffstatstatfiledesbuflstatstatlstatstat函数失败返回-1。以下是一些常见的st_modeS_IRUSRS_IWUSRS_IXUSRS_IRGRPS_IWGRPS_IXGRPS_IROTHS_IWOTHS_IXOTH。

2023-12-13 18:04:50 1093

原创 《Linux C编程实战》笔记:一些系统调用

此时,fcntl系统调用被用来设置或释放锁,当l_type取 F_RDLCK 或F_WDLCK时,在由l_whence、l_ start和l_len指定的区域上设置锁;结果解释:虽然open的时候设置的是O_TRUNC,是将文件截断为0,但是后面的代码用fcntl修改打开方式为O_APPEND,所以O_APPEND是存在的。如果某一文件区域已经存在文件记录锁了,则如果此时再设置新的锁在该区域的话,旧的锁将会被新的锁取代。因为进程2的锁已经释放了,只有进程1本进程的读锁,同一进程可以先读锁后写锁,所以成功。

2023-12-12 16:13:55 882

原创 《Linux C编程实战》笔记:文件读写

Linux c下文件读写可用creat,open,close,read,write,lseek等函数。对于跨平台的程序还是用C标准库的fopen等。

2023-12-11 17:31:53 1010

原创 QTableView示例

关于文件读取的有关代码先不讲,以后可能会出到文件io章节的内容,也可能烂尾了,反正总之是读到了,而且是一行一行读的,所以用了QStringList存储,每一项就是txt一行的内容。仅仅是本示例的需求的话,用QTableView的clicked信号也是能完成的,但是如果需要前后两项的信息的话还是用选择模型的信号。上进行选择时,Qt 会自动为其创建一个默认的选择模型,除非你显式设置了其他选择模型。这就是选择模型的用处了,不过我们本示例并没有需要用当之前项的地方,选择切换只会在状态栏显示最新的项的信息。

2023-12-10 17:16:42 1080 1

原创 Qt自定义组件的流程

这里只给出最开始控件项目的TBattery.h和TBattery.cpp代码,可以注意一下接口,方便在使用的工程里测试。以我之前写的电池为例,把电池当作一个自定义的组件,这样我们可以直接在Designer里拖出来。我们新建一个正常的Qt项目,然后再pro同目录下新建一个文件夹,我取名叫lib。之后选择添加库,注意是在使用的项目里点添加,不是最开始的控件的项目。起个名字,这里起的名字和我电池的文件名一样,这样比较方便。看一下对不对,也要是lib文件夹的路径,我之前这里就错了。这里可以根据自己的需求写说明。

2023-12-08 17:36:15 453

原创 使用Qt画一个电池

首先添加一个新文件,选择C++类,继承QWidget,名字为TBattery,记得选上Q_OBJECT,这样我们就得到一个头文件一个cpp文件了。具体而言,电池其实是一个QWidget,还有一个horizontalSlider,一个label,ui界面很简单。其实可以直接在主界面里写函数来画电池,不过这个电池之后还有用,所以选择把电池位置的QWidget进行提升。具体坐标都是事先算好的,左上角是(0,0),整个电池框长度是110,这样可以直接用电量值来画电量的图。随后,重写paintEvent。

2023-12-07 18:06:21 470 1

原创 QListView示例【Qt】

QListView的简单示例

2023-12-05 16:37:36 966 1

原创 基于GraphicsView的绘图程序[Qt]

以上,就完成了TGraphicsView的代码,但是ui里一开始放的是GraphicsView,所以我们右键ui里的GraphicsView,找到提升,然后输入TGraphicsView,就可以把我们ui里的View升级成TGraphicsView了。由于我们这个类也不是说是很完美的通用类,一些操作的槽函数可以在MainWindow里实现,我们的TGraphicsView就负责发送信号就行了。在这种模式下,当用户按住鼠标右键并移动时,视图会跟随鼠标移动而平移场景,实现类似于拖动手势的效果。

2023-12-01 16:00:33 959 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除