
Linux
文章平均质量分 51
Linux
执念、坚持
学习过程中,求职入行前遇到的问题;入职后,需求的解决方案探讨,都可以与我私信
展开
-
Makefile实例
除了编译参数-Werror,还可以加上-I参数,指定头文件路径,-Iinclude表示当前的inclue文件夹下。,前者表示当前目录,后者表示编译器指定的路径和GCC路径。工作中,我们希望把警告也当成错误来处理。此时就可以把c.c文件里的。原创 2024-06-26 23:20:45 · 186 阅读 · 0 评论 -
Makefile 函数
patsubst 函数是从var变量中取出每一个值,如果这个符合patten格式,把它替换成 replacement 格式。$(wildcard pattern) # pattern定义了文件名的格式, wildcard取出其中存在的文件。这个函数 wildcard 会以 pattern 这个格式,去寻找存在的文件,返回存在文件的名字。实例:(在该目录下创建三个文件:a.c b.c c.c)同时还可以利用其函数的特点来判断文件是否存在。原创 2024-06-26 22:39:15 · 265 阅读 · 0 评论 -
Makefile的语法
此时将暴露出问题,如果文件所依赖文件很多,岂不是要写很多规则,这显然是不合理的。下面我们可以使用通配符来解决这些问题。表示,它只有在使用到的时候才确定,在定义的时候等于没有确定下来。很明显看到 D 是等于 100baidu的,因为前面已经定义过了(A := xxx # A的值立即确定,在定义时即确定。B = xxx # B的值使用到时才确定。那怕通过命令行传入 D的值,里面的。前面Makefile 的写法如下。前面定义过,则不会再起作用)想使用变量的时候,使用。:表示第一个依赖文件。原创 2024-06-25 23:30:55 · 320 阅读 · 0 评论 -
Makefile的引入及规则
实际上widows工具管理程序的内部工具也是Makefile,在Linux开发裸板程序的时候,也是使用Makefile来管理这些程序的。使用开发工具开发程序时,点点鼠标就可以对其进行编译了;但是内部机制是怎么样的呢?他们是怎么管理代码的?又是怎么决定编译哪一个文件的。这条命令虽然简单,但是它完成的功能不简单。当依赖比目标文件新,则执行它们下面的命令。接下来我们手动来管理这个文件和程序。如无更新,就会显示如下。原创 2024-06-25 22:38:24 · 331 阅读 · 0 评论 -
GCC 编译过程
一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等 4 步才能变成可执行文件。原创 2024-06-24 23:28:32 · 338 阅读 · 0 评论 -
Http协议之Https
http协议是明文传输的,因此很容易被截取和解析,泄漏个人数据。https协议是在http和tcp之间多添加了一层,进行身份验证和数据加密。原创 2023-05-12 12:22:08 · 64 阅读 · 0 评论 -
http协议之详解
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);http协议的报文传输的是ASCII码,在TCP/IP协议之上,主要主要分为三部分。主要的响应数据,在浏览器的主体区域显示的数据都是相应主体!原创 2023-05-12 12:08:35 · 53 阅读 · 0 评论 -
socket,tcp,http三者之间的区别和原理
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口。(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。原创 2023-05-11 23:02:52 · 148 阅读 · 0 评论 -
基于 linux + c 实现的简易版 FTP
【代码】基于 linux + c 实现的简易版 FTP。原创 2023-04-17 17:18:58 · 477 阅读 · 0 评论 -
Linux 提供的socket API解析
是一个指向包含有本机IP地址及端口号等信息的sockaddr 类型的指针,指向要绑定给sockf的协议地址结构,这个地址结构根据地址创建socket 时的协议族不同而不同。数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且保证可靠、无差错的。它使用数据协议UDP。允许使用低层协议,原始套接字允许对低层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。指明所使用的的协议族,通常AF_INEF ,表示互联网协议族(TCP/IP协议族);原创 2023-03-22 16:04:04 · 341 阅读 · 0 评论 -
Linux 网络编程
TCP面向字节流,实际上是TCP把数据看出一连串无结构的字节流;UPD是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。UDP是无连接的,即发送数据之前不需要建立连接。TCP逻辑通信的信道是全双工的可靠信道,UDP则是不可靠的信道。原创 2023-03-22 15:15:09 · 59 阅读 · 0 评论 -
条件相关API
条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个回合场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。原创 2023-03-22 12:14:37 · 79 阅读 · 0 评论 -
互斥锁相关的API
互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。在设计时需要规定所有的线程必须遵守相同的数据访问规则。只有这样,互斥机制才能正常工作。操作系统并不会做数据访问的串行化。互斥变量用pthread_mutex_t数据类型表示。在使用互斥变量前必须对它进行初始化,可以把它置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量);原创 2023-03-21 23:36:12 · 107 阅读 · 0 评论 -
Linux之线程开发API概要 && 线程自身API
多线程开发在 Linux 平台上已经有成熟的 pthread 库支持。其涉及的多线程开发的最基本概念主要包含三点:线程创建退出等待互斥锁创建销毁加锁解锁条件创建销毁触发广播其它的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素操作封装出来。详细如下。原创 2023-03-21 21:48:10 · 83 阅读 · 0 评论 -
Linux 线程介绍
线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。原创 2023-03-21 18:29:11 · 81 阅读 · 0 评论 -
进程间通信(IPC)之 信号量(semaphore)
Linux下的信号量函数都是在通用信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。保证同一时刻只能有一个进程对某个资源进行访问,下面是一个让子进程先执行去访问资源的例子。最简单的信号量是只能取0和1的变量,这也是信号量最常见的一种形式,也叫二值信号量。每次对信号量的PV操作不仅限于对信号量值加1减1,而且可以加减任意正整数。信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。而可以取多个正整数的信号量被称为通用信号量。原创 2023-03-21 18:01:19 · 178 阅读 · 0 评论 -
进程间通信(IPC)之 信号编程
接下来利用signal 实现一下信号处理函数捕获信号。信号发送函数也不止一个,同样分为入门版和高级版。或者利用system 函数也可以实现这个功能。接下来看能不能捕获到 kill 信号。并不能捕捉到 kill 信号。高级版:sigaction。高级版:sigqueue。自己实现一个kill函数。入门版: signal。按下ctrl + c。原创 2023-03-21 11:40:40 · 86 阅读 · 0 评论 -
进程间通信(IPC)之 信号(signal)
每个信号都有一个名字和编号,这些名字都以“”SIG“”开头,例如“”SIGIO“”、"SIGOHLD"等等信号定义在 signal.h 头文件中,信号名都定义为正整数。具体信号名可以使用kill - l来查看信号的名字以及序号,信号从1开始编号,不存在0号信号。kill 对于信号0有特殊的应用。原创 2023-03-20 23:06:26 · 128 阅读 · 0 评论 -
进程间通信(IPC)之共享内存
pcrm命令可以移除一个消息对象。或者共享内存段,或者一个信号集,同时会将与ipc对象相关链的数据也一起移除。当然,只有超级管理员,或者ipc对象的创建者才有这项权利。用命令 ipcs可以查看进程间通信的共享内存的使用情况 (也可以查看信号量、创建共享内存/打开 (shmget),需要与其它通信方式配合,最合适的就是。,当然,互斥锁也可以解决这个问题。数据交互 (stycpy)释放共享内存 (shmdt)删除 (shmctl)映射 (shmat)但共享内存的使用会面临。共享内存有如下API。原创 2023-03-20 22:29:04 · 148 阅读 · 0 评论 -
进程间通信(IPC)之 消息队列
type < 0, 返回队列中消息类型值小于或等于type 绝对值的消息,如果有多个,则取类型值最小的消息。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位。消息队列,是消息的链表,存放在内核中。消息队列是面向记录的,其中的消息具有特点的格式以及特点的优先级。type > 0, 返回队列中消息类型为type的第一个消息。type = 0, 返回队列中的第一个消息。原创 2023-03-20 18:53:38 · 317 阅读 · 0 评论 -
进程间通信(IPC)之 有名管道
有名管道也就命名管道函数原型其中mode参数与open函数中的mode相同,一旦创建了一个FIFO,就可以用一般I/O函数操作它。mode则指定了文件的读写权限。有名管道也被称为FIFO文件,是一种特殊的文件。由于linux所有的事物都可以被视为文件,所有对有名管道的使用也就变得与文件操作非常统一。原创 2023-03-20 18:05:12 · 162 阅读 · 0 评论 -
进程间通信(IPC)之 无名管道
管道有固定的读端和写端,管道为空,read()会阻塞,管道满时,write会阻塞。在操作管道是,要求读、写端都存在,写端关闭时,read直接返回,返回值为0。它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。当一个管道建立时,就会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。半双工工作方式,读写端是分开的,fd[0]为读段,fd[1]写段。不能用lseek来定位。原创 2023-03-20 14:32:14 · 90 阅读 · 0 评论 -
进程间通信(IPC)
进程之间相互通信的其他技术--IPC(InterProcess Communication)。其中Socket 和 streams支持不同主机上的两个进程。管道(包括无名管道和命名管道)原创 2023-03-20 14:28:59 · 82 阅读 · 0 评论 -
Linux popen
代表一个指向以NULL结束的shell命令字符串的指针。命令行会将被到bin/sh并使用-c标志,shell将执行这个命令。执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL。popen对比system的好处在于,可以获取运行的输出结果。只能是只读或者写中的一种;system则会全部输出到终端。原创 2023-03-20 10:42:06 · 212 阅读 · 0 评论 -
Linux system
和exec的区别是:system执行完,代码还会回到原点往下执行, exec在代码执行正确是看不到 after xxx 的输出。错误方面也是跟exec是一样,只不过exec是拼接,system是直接覆盖了。如何掌握了exec族函数,就会发现system比exec简单粗暴多了。system 的原型。原创 2023-03-20 10:06:24 · 98 阅读 · 0 评论 -
exec配合fork使用
实现功能,当父进程检测到输入为1的时候,创建子进程把配置文件的字段值修改掉。这样看,子进程里面的代码会变得特别复杂。下面使用 execl 来进行简化。原创 2023-04-13 22:50:29 · 90 阅读 · 0 评论 -
linux进程之exec族函数
file: 如果参数file中包含/,则就将其视为路径名,否则就按PATH环境变量,在它所指定的各目录中搜寻可执行文件。由于execl的路径,每次都要whereis 去查找一下绝对路径,于是想着什么方法能省略这一步,答案是execlp可以。exec族函数在执行成功后不会返回,调用失败时,则会设置errno并返回-1,然后从原程序的调用点接着往下执行。arg:可执行程序带的参数,第一个参数为可执行文件名字,没有带路径且arg必须以NULL结束。当进程调用exec函数时,该进程被完全替换为新程序。原创 2023-03-19 23:02:53 · 138 阅读 · 0 评论 -
Linux 孤儿进程
父进程如果不等待子进程退出,在子进程之前就结束了自己的“”生命“”,此时子进程就叫做孤儿进程Linux 避免系统存在过多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。sleep(1);// 如果你在子进程中使用getppid()获取父进程的id发现不对则需要加上睡眠时间while(1){sleep(3);cnt++;exit(3);return 0;原创 2023-03-19 21:31:34 · 140 阅读 · 0 评论 -
等待子进程
子进程退出状态不被收集,变成僵尸进程(zombie)现在有子进程退出而不被回收的代码。为什么需要等待子进程退出?原创 2023-03-19 14:27:18 · 69 阅读 · 0 评论 -
vfork 与 fork的区别
vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行。现在我们用break来退出子进程的while。现在我们不调用exit来试试。原创 2023-03-19 13:25:49 · 95 阅读 · 0 评论 -
创建进程函数 fork 的使用
返回值为0, 代表当前进程是子进程。使用fork函数可以创建一个进程。fork函数调用成功,返回两次。不为0, 代表当前进程为父进程。原创 2023-03-18 23:16:29 · 243 阅读 · 0 评论 -
进程相关概念 && C程序的存储空间是如何分配
什么是程序,什么是进程,有什么区别?程序是静态概念,gcc xxx.c -o pro 磁盘中生成的pro文件就叫做程序进程是程序的一次运行活动,通俗点意思就是程序跑起来,系统中就会多了一个进程如何查看系统中有哪些进程,可以使用top指令查看,类似windows任务管理器什么是进程标识符?每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证pid = 0;称为交换进程作用:进程调度pid = 1: init进程作用:系统初始化编程调用getpid函数获取自身的进程标识符。原创 2023-03-18 21:56:13 · 93 阅读 · 0 评论 -
标准C库对文件的操作
【代码】标准C库对文件的操作。原创 2023-03-18 17:51:02 · 65 阅读 · 0 评论 -
文件写入整数和结构体
【代码】文件写入整数和结构体。原创 2023-03-18 16:56:40 · 70 阅读 · 0 评论 -
配置文件的修改
我现在有一个文件 TEST.config, 里面数据为。我现在通过代码把LENG 改成其它数字。原创 2023-03-18 15:58:08 · 89 阅读 · 0 评论 -
实现Linux cp 命令
close这两个文件 (src, des)打开/创建des(目标文件)打开源文件(src)原创 2023-03-18 12:15:23 · 115 阅读 · 0 评论 -
文件描述符
对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。而读写一个文件,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。STDIN_FLENO、STDOUT_FILENO、STDERR_FILENO这几个宏代替了0、1、2这几个数。现在也可以知道为什么open的得到文件描述符是从3开始了, 0 1 2 被系统默认了。按照惯例,UNIX shell 使用文件描述符。原创 2023-03-17 23:27:51 · 155 阅读 · 0 评论 -
文件打开创建补充
用该属性去打开文件是,如果这个文件中本来就有内容,而且为只读或只写成功打开,则将其长度截短为0。(也就是把原有的内容删掉,再添加新的)如果同时指定OCREAT,而文件已经存在,则出错,也就是返回-1。会把内容加到末尾,如果不使用O_APPEND则会出现覆盖现象。结果明显就是把原有的内容删除掉,再写入新的内容。例如我的file1文件现有如下内容。例如,现在我的file1内容如下。每次写时都会加到文件的尾端。原创 2023-03-17 22:01:55 · 63 阅读 · 0 评论 -
文件读取操作
这是光标的问题,因为读的时候,光标已经在内容的最后了,所有读的一直是内容后面的内容。在读取前需要知道写入 write 这个API的返回值,如果写入失败会返回 -1;:读的时候重新把关闭移到内容的最前面,重新打开最可以实现。接下来是我们的读取操作了,把写入的内容读取出来。这时候就能成功读取到file1文件里面的内容了。也可以利用其API来计算读出来的内容的大小。哈,现在看,结果并没有读取到写入的内容。:利用文件“”光标“”位置的API。先看一下头文件和API的原型。原创 2023-03-17 21:09:54 · 92 阅读 · 0 评论 -
文件写入操作编程
ok,现在内容已经可以写入到file1文件中了。具体操作,需要往file1文件中写入内容。现在打开file1文件,可以看到。需要包含的头文件以及用法介绍。原创 2023-03-17 17:36:31 · 86 阅读 · 0 评论