- 博客(91)
- 收藏
- 关注
原创 项目实战:基于Linux的Flappy bird游戏开发
Ncurses是最早的System V Release 4.0 (SVr4)中 curses的一个克隆和升级。这是一个可自由配置的库,完全兼容旧版本curses。Ncurses构成了一个工作在底层终端代码之上的封装,并向用户提供了一个灵活高效的API(Application Programming Interface 应用程序接口)。它提供了创建窗口界面,移动光标,产生颜色,处理键盘按键等功能。使程序员编写应用程序不需要关心那些底层的终端操作。简而言之,它是一个管理应用程序在字符终端显示的函数库。
2024-11-02 09:36:27 1245
原创 信号灯/信号量(semaphore)
如果至少有一个线程阻塞在该 sem上,表示有线程等待资源,信号量为 0,这时该函数保持信号量为 0 不变,并使某个阻塞在该 sem 上的线程从 sem_wait 函数中返回。释放资源,如果没有线程阻塞在该 sem 上,表示没有线程等待该资源,这时该函数就对信。获取资源,如果信号量为 0,表示这时没有相应资源空闲,那么调用线程就将挂起,直到有。参数:key:ftok 产生的 key 值(和信号灯关联的 key 值)SETVAL:设置信号灯的值,需要用到第四个参数:共用体。mode:文件权限。
2024-11-01 19:30:13 848
原创 深入探索共享内存
通过映射共享内存到各个进程的地址空间,进程可以直接访问共享数据,避免了复制和消息传递的开销,适用于需要高性能和低延迟的应用场景。:如果一个进程附加(attach)了共享内存但没有显式分离(detach),通常在进程终止时,操作系统会自动将共享内存从进程的地址空间中分离(detach),但不会删除共享内存本身。其他进程仍然可以访问这块共享内存。:主要是对实时数据传输的要求场合,在需要高实时性的系统中,如工业控制系统、航空航天系统,共享内存用于快速传输传感器数据、控制指令等,以实现及时的反应和处理。
2024-10-31 09:09:09 684
原创 消息队列的使用
cmd 要执行的操作 IPC_STAT / IPC_SET / IPC_RMID(删除)MSG_EXCEPT:与msgtype配合使用返回队列中第一个类型不为msgtype的消息。IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG。IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回。1 消息结构必须有long类型的msg_type字段,表示消息的类型。msgtype>0:收到的第一条 msg_type类型的消息。
2024-10-31 09:02:12 848
原创 信号机制下(阻塞、信号集、信号驱动任务)
有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。SIG_BLOCK : 把参数set中的信号添加到信号屏蔽字中。SIG_UNBLOCK: 从信号屏蔽字中删除参数set中的信号。SIG_SETMASK: 把信号屏蔽字设置为参数set中的信号。首先,若oset是非空指针,那么进程的当前信号屏蔽字通过oset返回。
2024-10-31 08:39:30 302
原创 信号机制上(信号概念、发送、定时器、信号捕捉、SIGCHLD)
0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。< -1: 取绝对值,发送信号给该绝对值所对应的进程组的所有组员。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。= -1:发送信号给,有权限发送的所有进程。使用signal/sigaction 函数,把自定义的handle和指定的信号相关联。SA_RESTART:使被信号打断的系统调用自动重新发起。
2024-10-30 17:08:16 812
原创 共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)
创建共享内存映射成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。prot:指定共享内存的访问权限。可取如下几个值的可选:PROT_READ(可读), PROT_WRITE(可写), PROT_EXEC(可执行), PROT_NONE(不可访问)。
2024-10-30 17:00:00 773
原创 有名管道和无名管道
4.对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。2.管道通信是单工的,一端读,一端写(程序实现设计好)。3. 管道已满,write阻塞。
2024-10-29 15:25:43 593
原创 线程池及gdb调试多线程
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。概念:通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。判断是否有空闲的工作线程。
2024-10-29 15:21:03 553
原创 条件变量基本使用
2、如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。1、pthread_cond_wait(&cond, &mutex),在没有资源等待是是先unlock 休眠,等资源到了,再lock。所以pthread_cond_wait he pthread_mutex_lock 必须配对使用。
2024-10-29 13:37:26 349
原创 线程的取消和互斥
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。
2024-10-29 10:36:16 371
原创 线程的取消和清理
4.线程内的return 可以结束线程,也可以给pthread_join返回值,但不能触发pthread_cleanup_push里面的回调函数,所以我们结束线程尽量使用pthread_exit退出线程。2.pthread_cleanup_pop()被执行且参数为0,pthread_cleanup_push回调函数routine不会被执行.3.pthread_cleanup_push 和pthread_cleanup_pop可以写多对,routine执行顺序正好相反。输入命令bt(打印调用栈)
2024-10-29 10:27:21 291
原创 线程的回收及内存演示
*通过线程属性来设置游离态(分离态)*/int pthread_detach(pthread_t thread);–指定该状态,线程主动与主控线程断开关系。注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待。错误类型:参数不匹配,期望的是char * ,但参数retv是void *解决:在参数前面加强制类型转换(char*)retv。错误可能:1拼写错误,2对应的头文件没有包含。错误类型:未知的类型pthead_t。
2024-10-29 08:47:26 272
原创 线程的创建和参数传递
意义:表示pthread_create参数3的定义和实际代码不符合,期望的是void * (*)(void *) ,实际的代码是int * (*)(char *)collect2: error: ld returned 1 exit status --------这个链接错误,使用多线程的好处:大大提高了任务切换的效率,避免了额外的TLB & cache的刷新。arg 传递给routine的参数 ,参数是void * ,注意传递参数格式,注意事项:1. 主进程的退出,它创建的线程也会退出。
2024-10-29 08:41:26 899
原创 exec函数族和进程
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。1、背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望 ,父子进程执行不同的代码。成功:返回调用进程的会话ID;
2024-10-28 19:16:13 555
原创 进程的创建和回收
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。pid
2024-10-28 18:57:39 837
原创 目录操作和文件属性获取
使用文件描述符,要配合open函数使用DIR是用来描述一个打开的目录文件的结构体类型成功时返回目录流指针;出错时返回NULL。
2024-10-28 18:38:07 820
原创 文件IO(概念、打开、读、写、关闭)
什么是,又称系统IO,系统调用是操作系统提供的API接口函数。POSIX接口 (了解)可移植操作系统接口注意:文件IO不提供缓冲机制文件IO的API英文:缩写fd(file descriptor)文件描述符是一个非负整数。是0-1023的数字,表示文件。
2024-10-28 18:11:34 925
原创 流刷新定位
成功时返回0;出错时返回EOF将流缓冲区中的数据写入实际的文件Linux下只能刷新输出缓冲区,输入缓冲区丢弃如果输出到屏幕使用fflush(stdout)
2024-10-28 09:25:09 1016
原创 标准IO介绍及缓冲区
文件概念:一组相关数据的有序集合1.Linux IO进程课程目的:学习编写linux应用程序(APP)2.Linux文件的种类 :常规文件 r目录文件 d字符文件 c块文件 b管道文件 p套接字文件 s符号链接文件(相当于windows快捷方式) l3.IO的概念I input 输入设备 比如键盘鼠标都是Input设备O output 输出设备 比如显示器。
2024-10-28 08:51:18 765
原创 hash表原理和数据结构排序
若发送冲突时,在H(key)的前后找一个空闲单元存放冲突的记录,即在H(key)的基础上获取下一个地址:Hi=(H(key)+di)%m,其中m为表长,%运算是保证Hi落在[0,m-l]区间;di的取法有多种:(1)di=1,2,3,.....(m-1)----称为线性探查法;设记录的key集合k={50,36,66,76,36,12,25,95},每次以集合中第一个key为基准的快速排序过程。若在排序前Ri领先Rj,排序后Ri仍领先于Rj,则称这种排序是稳定的,其含义是它没有破坏原本已有序的次序。
2024-10-26 14:45:10 293
原创 数据结构查找
顺序、折半、分块查找和树表的查找中,其ASL的量级在O(n)~O(log2n)之间。不论ASL在哪个量级,都与记录长度n有关。随着n的扩大,算法的效率会越来越低。ASL与n有关是因为记录在存储器中的存放是随机的,或者说记录的key与记录的存放地址无关,因而查找只能建立在key的“比较”基础上。
2024-10-26 14:21:19 781
原创 数据结构树及实现
二叉树是n(n≥0)个节点的有限集合或者是空集(n=0)或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。树中任何节点都可以有零个或多个直接后继节点(子节点),但至多只有一个直接前趋节点(父节点),根节点没有前趋节点,叶节点没有后继节点。有n个节点的完全二叉树可以用有n+1个元素的数组进行顺序存储,节点号和数组下标一一对应,下标为零的元素不用。节点的层数等于父节点的层数加一,根节点的层数定义为一。路径中前面的节点是后面节点的祖先,后面节点是前面节点的子孙。
2024-10-26 14:15:50 735
原创 队列实现及应用
在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。规定:front指向队头元素的位置;为区别空队和满队,满队元素个数比数组元素个数少一个。队列是限制在两端进行插入操作和删除操作的线性表。创建队列 :CreateQueue ()清空队列 :ClearQueue (Q)判断队列空 :EmptyQueue(Q)判断队列满 :FullQueue(Q)入队 :EnQueue (Q , x)允许进行删除操作的一端称为“队头”出队 :DeQueue(Q)
2024-10-26 14:13:02 205
原创 栈实现及应用
它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)允许进行操作的一端称为“栈顶”另一固定端称为“栈底”
2024-10-26 09:49:11 211
原创 单链表的操作实现
算法思路:设p,q 分别为链表中相邻两结点指针,求p->data+q->data为最大的那一组值,返回其相应的指针p即可。算法思路:设指针p、q分别指向表A和B中的结点,若p->data ≤q->data则p结点进入结果表,否则q结点进入结果表。3、设两单链表A、B按data值(设为整型)递增有序,将表A和B合并成一表A,且表A也按data值递增有序。2、设结点data域为整型,求链表中相邻两结点data值之和为最大的第一结点的指针。算法思路:依次取原链表中各结点,将其作为新链表首结点插入H结点之后。
2024-10-26 09:42:59 194
原创 线性表之单链表
依次读入表L=(a0,.....,an-1)中每一元素ai(假设为整型),若ai≠结束符(-1),则为ai创建一结点,然后插入表尾,最后返回链表的头结点指针H。算法思路:调用算法GetLinklist(h, i-1),获取结点ai-1的指针p(ai 之前驱),然后申请一个q结点,存入x,并将其插入p指向的结点之后。算法思路:从链表结点a0起,依次判断某结点是否等于x,若是,则返回该结点的地址,若不是,则查找下一结点a1,依次类推。链表的插入:即实现InsertLinklist(h, x, i,)。
2024-10-26 09:26:14 338
原创 线性表之顺序表
线性表L可用二元组形式描述:L=(D,R) 既线性表L包含数据元素集合D和关系集合R线性表的特征:对非空表,a0是表头,无前驱;清除线性表中重复的元素:对当前表中的每一个ai(0≤i≤n-2),依次与aj(i+1≤j≤n-1)比较,若与ai相等,则删除之。线性表的合并:一次取表Lb中的bi(i=0,1,......,n-1),若bi不属于,则将其插入表La中。插入:linsert(L,x,i)。取表中某一个元素:GetList(L,i),即ai。删除表L中第i个元素ai,且表长减1,要求0≤i≤n-1。
2024-10-26 09:19:59 403
原创 数据结构的基本概念
数据结构反映数据的内部构成,即数据由那部分构成,以什么方式构成,以及数据元素之间呈现的结构。顺序结构:将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中,如c语言的一维数组,表的L=(a1,a2......,an)的顺序结构。散列存储:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,然后数据元素按地址存放。索引存储:在存储数据的时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。二、数据的存储结构(逻辑结构在计算机中的具体实现方法)图状结构--多个对多个,如图。
2024-07-25 14:50:27 201
原创 Linux C语言:C语言共用体和枚举
在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者在本质上的不同仅在于使用你内存的方式上共用体的定义语法:union 共用体名共用体成员列表共用体的使用union 共用体名 变量名union 共用体名 变量名 = {成员值}定义共用体时顺便创建变量int age;char sex;char ch;
2024-07-24 15:37:45 946
原创 Linux C语言:结构体指针和结构体嵌套大小及位域
作用:通过指针访问结构体中的成员语法:struct 结构体名 *指针名;利用操作符->可以通过结构体指针访问结构体属性点(.)是用于访问成员,箭头(->)是用于结构体指针访问成员。访问结构成员的运算符有两种,一种是结构成员运算符“·”,也称为“圆点运算符”,另一种是结构指针运算符“->”,也称“箭头运算符”。圆点运算符是比较古老的写法,不能访问结构体指针变量成员,现在都推荐使用箭头运算符,即->
2024-07-24 15:18:49 408
原创 Linux C语言:C结构体及结构体数组
正式:结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。通俗:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型语法:struct 结构体名结构体成员列表。
2024-07-24 15:13:53 269
原创 Linux NFS服务搭建及使用
nfs ( Network File System )即网络文件系统,其基于 UDP/IP使用 nfs 能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其它计算机中的文件就像在访问自己的计算机一样。2)运行下面的命令,创建一个目录,并在该文件下创建一个文件,用于测试nfs。6)使用下面的命令,将共享目录挂在到/mnt目录下,并修文件。1) 运行下面的命令安装NFS服务器(需要保持网络通畅)。7)使用下面的命令,查看原来的文件已经被修改。5)使用下面的命令,重启NFS服务。
2024-07-19 23:24:53 521
原创 Linux TFTP服务搭建及使用
TFTP ( Trivial File Transfer Protocol )即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。8)如果TFTP的下载不成功,运行下面的命令卸载软件(连同配置信息一起),然后再重新安装,最后再重启TFTP服务器。TFTP_DIRECTORY="/tftpboot" // 我们设定的 TFTP 根目录;TFTP_OPTIONS="-c -l -s" //TFTP 启动参数。
2024-07-18 22:41:49 1186
原创 linux shell脚本编程(分支语句、循环语句)
bin/bash#学生成绩分级管理#80-100:A#60-79 :B#0-59:C#-o ||#-a &&thenexitfiecho "A ";;;*)echo"C ";;esacstatementsfunction 是 Shell 中的关键字,专门用来定义函数;name 是函数名;statements 是函数要执行的代码,也就是一组语句;
2024-07-18 16:58:09 976
原创 Linux C语言:一维数组、字符数组和字符串数组打印总结
1、sizeof(数组名),表示计算整个数组大小;2、sizeof(&数组名),表示计算整个数组所占地址大小,而一旦是计算地址,只有两个值:4字节(32位操作系统),8字节(64位操作系统);3、除了这两种情况外,所有的数组名代表的都是首元素的地址!4、sizeof(字符串)时,将会把字符串后面自带的\0计算在内,而\0在内存中占一个字节;
2024-06-19 16:27:55 991
原创 shell脚本编程(概念、编程和语句)
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的在 shell 编程中通常使用全大写变量,方便识别$ COUNT=1变量的调用:在变量前加 $Linux Shell/bash 从右向左赋值$Y=y$ X=$Y$ echo $Xy使用 unset 命令删除变量的赋值$ Z=hello$ echo $Zhello$ unset Z$ echo $Z双引号 : 允许通过 $ 符号引用其他变量值。
2024-06-18 17:06:59 1331
原创 shell命令(进程管理和用户管理)
用户名口令用户 ID ( UID )用户主目录( HOME )用户 shell语法: adduser 添加用户名为 newuser 的新用户。
2024-06-18 14:34:40 718
原创 shell命令(文件搜索、文件处理和压缩解压)
当然,之后出现 tar 程序的改进版本,可以实现在合并归档的同时进行压缩。使用“ ls –l” 命令可以查看到新创建的链接文件所指向的目标文件名。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足 OPTIONS :描述命令所有的参数或选项。软链接(符号链接)是利用文件的路径名建立链接。硬链接是利用 Linux 中为每个文件分配的物理编号—— inode 建立链接。①and :逻辑与,在命令中用 -a 表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足。
2024-06-18 14:04:33 1459
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人