linux系统编程
文章平均质量分 75
StudyWinter
持续学习
展开
-
shell学习
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写易调试、灵活性强。1.基本语法(1)定义变量:变量=值(2)撤销变量:unset 变量(3)声明静态变量:readonly变量,注意:不能unset2.变量定义规则(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。(2)等号两侧不能有空格。(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。.....................原创 2022-08-09 17:04:27 · 239 阅读 · 0 评论 -
【linux系统编程】linux下gdb调试方法与技巧整理
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;总的来说在Linux下开发程序gdb/cgdb是必须学会使用的,他的强大之处远不止于此,在程序的调试中用它会提高的我们的调试效率,当然gdb的功能与使用技巧还不止于此,多多探索,多多学习使用。参考链接httpslinux下gdb调试方法与技巧整理_花开蝶自来-liu的博客-CSDN博客_gdb调试httpshttps。...转载 2022-07-26 20:15:51 · 2749 阅读 · 0 评论 -
大端字节序和小端字节序
在几乎所有的平台上,多字节对象都被存储为连续的字节序列。例如在 C 语言中,一个类型为的变量地址为,那么其指针的值为。且的四个字节将被存储在内存的位置。字节的排列方式有两个通用规则:举例:数字0x12345678小端模式中的存储方式为:大端模式中的存储方式为:那么问题来了,怎么判断机器是大端存储还是小端存储呢(1)使用强制类型转换 结果(2)使用联合体 结果...原创 2022-07-13 19:50:35 · 1220 阅读 · 0 评论 -
线程同步之信号量
由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。信号量,是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。作用:初始化一个信号量2.2 sem_destroy函数作用:销毁一个信号量2.3 sem_wait函数作用:给信号量加锁--2.4原创 2022-06-26 11:56:54 · 1384 阅读 · 2 评论 -
线程同步之条件变量
条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。线程抢占互斥锁时,线程A抢到了互斥锁,但是条件不满足,线程A就会让出互斥锁让给其他线程,然后等待其他线程唤醒他;一旦条件满足,线程就可以被唤醒,并且拿互斥锁去访问共享区。经过这中设计能让进程运行更稳定。作用:初始化一个条件变量静态初始化和动态初始化3.2 pthread_cond_destroy函数作用:销毁一个条件变量3.3 pthread_cond_wait函数(重点)作用:(非常重要原创 2022-06-25 11:59:51 · 1182 阅读 · 0 评论 -
线程同步之读写锁
与互斥量类似,但读写锁允许更高的并行性。其特性为: 写独占,读共享。特别强调: 读写锁只有一把, 但其具备两种状态:1 读模式下加锁状态 (读锁);2 写模式下加锁状态 (写锁) 。1 读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线程都会被阻塞;2 读写锁是“读模式加锁”时, 如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞;3 读写锁是“读模式加锁”时, 既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。 读锁、写锁并行阻原创 2022-06-24 11:10:04 · 833 阅读 · 0 评论 -
线程同步之互斥量(互斥锁)
所谓同步, 即同时起步,协调一致。不同的对象, 对“同步” 的理解方式略有不同。 如,设备同步,是指在两个设备之间规定一个共同的时间参考; 数据库同步, 是指让两个或多个数据库内容保持一致,或者按需要部分保持一致; 文件同步, 是指让两个或多个文件夹里的文件保持一致等等。而编程中、 通信中所说的同步与生活中大家印象中的同步概念略有差异。“同” 字应是指协同、协助、互相配合。主旨在协同步调,按预定的先后次序运行。同步即协同步调,按预定的先后次序运行。线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,原创 2022-06-23 11:37:45 · 658 阅读 · 0 评论 -
linux之线程
关于线程和进程的区别:进程和线程的详解和区别_StudyWinter的博客-CSDN博客_任务进程线程的区别(1)轻量级进程(light-weight process),也有 PCB,创建线程使用的底层函数和进程一样,都是 clone;(2)从内核里看进程和线程是一样的,都有各自不同的 PCB,但是 PCB 中指向内存资源的三级页表是相同的(下图区别进程)(3)进程可以蜕变成线程;(4)线程可看做寄存器和栈的集合;(5)在 linux 下,线程最是小的执行单位;进程是最小的分配资源单位线程概念:原创 2022-06-22 12:12:26 · 248 阅读 · 0 评论 -
会话和守护进程
进程组,也称之为作业。 BSD 于 1980 年前后向 Unix 中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在 waitpid 函数和 kill 函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组 ID==第一个进程 ID(组长进程)。所以,组长进程标识:其进程组 ID==其进程 ID 。可以使用 kill -SIGKILL -进程组 ID(负的)来将整个进程组内的进程全部杀死 。原创 2022-06-22 11:00:21 · 192 阅读 · 0 评论 -
linux系统编程之信号
信号在我们的生活中随处可见, 如:古代战争中摔杯为号;现代战争中的信号弹;体育比赛中使用的信号枪......它们都有共性: 1. 简单 2. 不能携带大量信息 3. 满足某个特设条件才发送。信号是信息的载体, Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。Unix 早期版本就提供了信号机制,但不可靠,信号可能丢失。 Berkeley 和 AT&T 都对信号模型做了更改,增加了可靠信号机制。但彼此不兼容。 POSIX.1 对可靠信号例程进行了标准化。A 给 B 发送信号,原创 2022-06-20 14:54:55 · 550 阅读 · 0 评论 -
进程之wait函数和waitpid函数
一个进程终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或者waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在shell中用特殊变量$?查看,因为shell是它的父进程,当它终止时,shell调用wait或者waitpid得到它的退出状态,同时彻底清除掉这个进程。wait函数下面这个例子,使用wait来原创 2022-06-20 11:51:41 · 750 阅读 · 0 评论 -
孤儿进程和僵尸进程
Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。那么孤儿进程是什么呢?1 孤儿进程孤儿进程就是父进程先于子进程终止,这时子进程就是【孤儿进程】,会被init收养。先熟悉一个命令:查看进程状态ps ajx执行依次是父进程id、进程id、组进程id、会话进程id这里只要关注父进程id和进程id即可.原创 2022-05-28 16:27:46 · 263 阅读 · 2 评论 -
2.1.4 进程之间的通信(共享通信、消息传递、管道通信)
1 思维导图进程通信分为共享内存、管道通信、消息传递(1)共享内存:要互斥地访问共享空间;(2)管道通信:一个管道只能实现半双工通信;写满时,不能再写,读空时,不能再读;没写满,不能读,没读空,不能写。(3)消息传递2进程通信图中我们可以知道什么是进程通信,以及进程通信的低级和高级方式; 我们还可以知道为什么要引入进程通信方式,以及它的意义进程通信就是进程之间的信息交换。2.1共享存储共享一块大家...原创 2022-05-19 17:33:52 · 2542 阅读 · 1 评论 -
进程和线程的详解和区别
1 进程和线程概述我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之上的。2 进程我们编写的代码只是一个存储在硬盘的静态文件,通过编译后就会生成二进制可执行文件,当我们运行这个可执行文件后,它会被装载到内存中,接着 CPU会执行 程序中的每一条指令,那么这个运行中的程序,就被称为「进程」。进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行转载 2022-05-13 10:56:00 · 8362 阅读 · 1 评论 -
【 c/c++学习】makefile练习
编写一个 makefile 可以将其所在目录下的所有独立 .c 文件编译生成同名可执行文件。例如,有add.c、sub.c等等#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<pthread.h>int main(int argc, char* argv[]){ int a = 10, b = 20;原创 2021-09-15 11:26:56 · 252 阅读 · 0 评论 -
【c/c++学习】makefile学习
1、为什么要使用Makefile怎么高效地编译程序?想达到什么样的效果?请参考Visual Studio:修改源文件或头文件,只需要重新编译牵涉到的文件,就可以重新生成文件。命令:makefile或者Makefile2、规则2.1、1 个规则目标:依赖条件(一个tab缩进)命令(1)目标的时间必须晚于依赖条件的时间,否则,更新目标;(2)依赖条件如果不存在,找寻新的规则去产生依赖条件。ALL:指定 makefile 的终极目标。2.2、2个函数wildcard和p原创 2021-09-11 14:37:04 · 864 阅读 · 0 评论 -
【linux学习】gcc学习
源文件需要经过编译才能生成可执行文件。在Windows下进行开发时,只需要点几个按钮即可编译,集成开发环境(比如Visual studio)已经将各种编译工具的使用封装好了。Linux下也有很优秀的集成开发工具,但是更多的时候是直接使用编译工具;即使使用集成开发工具,也需要掌握一些编译选项。PC机上的编译工具链为gcc、ld、 objcopy、 objdump 等,它们编译出来的程序在x86平台上运行。要编译出能在ARM平台,上运行的程序,必须使用交叉编译工具xx-gcc、xxx-Id等(不同版本的编译器的原创 2021-09-10 20:39:10 · 417 阅读 · 0 评论 -
【c/c++学习】linux下vim自动在c文件插入文件头
set nuautocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()""""定义函数SetTitle,自动插入文件头func SetTitle()"如果文件类型为.sh文件if &filetype == 'sh'call setline(1,"\#########################################################################")call app.原创 2021-09-05 15:28:03 · 1470 阅读 · 2 评论 -
【c/c++】静态库
1、静态库介绍静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。程序编译一般需经预处理、编译、汇编和链接几个步骤。静态库特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动原创 2021-09-04 21:10:09 · 5915 阅读 · 0 评论 -
【linux学习】基础学习
一、shell作用:命令解析器ubuntu使用的是bash在终端查看echo $SHELL终端:所有输入、输出设备的总称TAB补齐历史命令:history快捷键:【补充】二、目录和文件操作Linux系统目录:bin:存放二进制可执行文件boot:存放开机启动程序dev:存放设备文件: 字符设备、块设备home:存放普通用户etc:用户信息和系统配置文件 passwd、grouplib:库文件:libc.so.6root:管理员宿主目..原创 2021-09-01 16:20:57 · 119 阅读 · 0 评论 -
【linux学习】vim学习
一、工作模式命令模式文本模式末行模式二、切换文本i:向前插入a:向后插入o:向下一行I:行首A:行尾O:上一行s:删除光标所选字符S:删除光标所选行三、移动光标h:左j:下k:上l:右gg:行首G:末行nG:指定行%:完成括号之间定位四、查找1 查找未知的字符。在命令模式下,输入/,再输入关键字。n下一个2 查找已知的字符,想知道后面还有多少个,光标定位在单词身上,*/#继续查询五、替换1 单行替换:末行模式下,原创 2021-09-07 15:41:44 · 116 阅读 · 0 评论 -
【Linux】之安装完整的 man page
今天在学习线程锁的时候,发现有些函数在man page下找不到,查资料,发现是没有安装完整的man pag,安装即可。1、安装 C语言 库函数基本帮助文档:sudo apt-get install libc-devsudo apt-get install glibc-docsudo apt-get install manpagessudo apt-get install manpages-desudo apt-get install manpages-de-devsudo apt-get原创 2021-11-22 19:59:51 · 2089 阅读 · 0 评论 -
【linux系统编程】文件系统
一、文件存储知识体系整体示意图1.1、dentry目录项,其本质依然是结构体,重要成员变量有两个 {文件名, inode, ...},而文件内容(data)保存在磁盘盘块中。1.2、inode其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置……也叫作文件属性管理结构,大多数的 inode 都存储在磁盘上。少量常用、近期使用的 inode 会被缓存到内存中。1.3、硬链接硬链接和原文件有相同的inode号,有不相同的dentry.原创 2021-09-20 20:48:44 · 289 阅读 · 0 评论 -
【linux系统编程】文件IO
一、系统调用二、打开/关闭文件原创 2021-09-20 11:30:19 · 176 阅读 · 0 评论 -
【linux系统编程】open函数
1、位置在命令行下输入man 2 open2、函数原型int open(const char *pathname, int flags); 参数: pathname:欲打开文件路径 flags:文件打开方式 (#include <fcntl.h>) O_RDONLY, O_WRONLY, O_RDWRO_RDONLY|O_WRONLY|O_RDWR O_CREAT|O_APPEND|..原创 2021-09-15 15:32:14 · 557 阅读 · 0 评论