![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux应用编程与网络编程
linux
most delay
这个作者很懒,什么都没留下…
展开
-
socket网络编程
1.linux网络编程框架1网络是分层的(1)oSI7层模型32(2)网络为什么要分层(3)网络分层的具体表现1.1TCP / IP 协议引入(1) TCP / IP 协议是用的最多的网络协议实现(2) TCP / IP 分为4层,对应 OSI 的7层(3)我们编程时最关注应用层,了解传输层,网际互联层和网络接入层不用管1.2BS 和 Cs(1) cs 架构介绍( broswer(2 Cs 架构介绍( broSwer )2.关于 TCP 理解的重点(1)TCP 协议工作在传输层,对上原创 2021-09-08 23:18:41 · 140 阅读 · 0 评论 -
linux网络通信基础知识
1.网络通信的层次(1)硬件部分:网卡(2)操作系统底层:网卡驱动(3)操作系统API:socket接口(4)应用层:低级(基于socket接口编程)(5)应用层:高级(基于网络通信应用框架库)(6)应用层:更高级(http、网络控件等)2.学习关键(1)掌握网络通信的架构层次和基本原理(2)掌握socket及其相关函数的使用(3)掌握服务器和客户端程序通信的方法3.网络通信基础知识之网络通信发展历程(1)单机阶段(2)局域网阶段(3)广域网internet阶段(4)移动互联网原创 2021-09-02 23:42:10 · 246 阅读 · 0 评论 -
线程的介绍及同步线程的使用
1.用父子进程来同时读取键盘和鼠标#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(void){ int fd = -1; int pid = -1; char buf[2原创 2021-09-01 21:52:54 · 113 阅读 · 0 评论 -
linux非阻塞IO与阻塞IO的应用
1.为什么有阻塞IO(1)常见的阻塞:wait、pause、sleep等函数,read和write某些特殊文件时(2)阻塞式的好处,在阻塞等待的进程不消耗CPU运行,提高性能。2.如何实现非阻塞IO访问(1)O_NONBLOCK和fcntl3.阻塞式IO的困境(1)程序中读取键盘#include <stdio.h>#include <string.h>#include <unistd.h>int main(void){ char b原创 2021-08-31 19:01:41 · 3351 阅读 · 0 评论 -
信号的介绍及使用
1.什么是信号(1)信号是内容受限制的一种异步通信机制(2)信号的目的是用来通信(3)信号是异步的(对比硬件中断)(4)信号本质上是int型数字编号(事先定义好的)2.信号由谁发出(1)用户在终端按下按键(2)硬件异常后由操作系统内核发出信号(3)用户使用kill命令向其他进程发送信号(4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM信号,向一个读端已经关闭的管道write时会产生SIGPIPE信号3.信号由谁处理、如何处理(1)忽略信号(2)捕捉信号原创 2021-08-31 00:37:50 · 1389 阅读 · 4 评论 -
linux进程间的通信
1.进程间为什么要通信(1)进程间通信(IPC)指的是两个任意进程之间的通信。(2)同一个进程在一个地址空间中,所以同一个进程的不同模块(不同函数、不同文件)之间都是很简单的(很多时候都是全局变量、也可也通过函数形参实参传递)(3)2个不同的进程处于不同的地址空间,因此要互相通信很难。2.什么样的程序设计需要进程间通信(1)只有很少的程序需要进程间通信,大部分程序都是单进程的(可以多线程)(2)复杂、大型的程序,因为设计的需要就必须设计为多进程程序(我们整个程序需要多个进程同时工作来完成),常见原创 2021-08-29 17:42:12 · 90 阅读 · 0 评论 -
守护进程的介绍与使用
1.进程查看命令ps(1)ps -ajx:偏向显示各种有关的ID(2)ps -aux:偏向显示进程的各种占用资源2.向进程发送信号命令kill(1)kill -信号编号 进程ID,向一个进程发送一个信号(2)kill -9 xxx,向xxx这个进程发生9号信号,也就是结束这个进程3.何为守护进程(1)daemon(2)长期运行(一般是开机运行直到关机)(3)与控制台脱离(关闭终端不会结束该进程,这个问题还在与会话)(4)服务器(server)服务器就是一个一直在运行的程序,可以提供我们某原创 2021-08-29 15:26:21 · 939 阅读 · 1 评论 -
进程状态和关系及system函数
1.进程的五种状态(1)就绪态:这个进程当前所有运行条件都就绪,只要得到CPU时间就能直接运行。(2)运行态:就绪态得到CPU开始运行。(3)僵尸态:子进程已经结束,父进程还没来得及回收(4)等待态:(浅度睡眠&深度睡眠),进程在等待某种条件,条件成熟后进入就绪太。浅度睡眠可以被(信号)唤醒,而深度睡眠不能被唤醒只能等待条件才能被唤醒。(5)暂停态:暂停并不是进程终止,只是被信号暂停了,还可以恢复的。2.system函数的简介int system(const char *command原创 2021-08-29 10:40:47 · 162 阅读 · 0 评论 -
exec族函数的介绍与使用
1.为什么需要exec函数(1)fork子进程是为了执行新的程序(2)可以直接在子进程的if中写入新程序的代码,但是不够灵活,因为只能将子进程程序的源代码贴过来执行(必须知道源码,而且源码太长不好控制)比如要执行 ls -la命令就不行。(3)使用exec运行新的可执行程序(可以把一个编译好的的可执行程序直接家在运行)(4)我们有了exec族函数后,我们典型的父子进程就是这样的:子进程需要运行的程序被单独编写、单独编译成一个可执行文件(叫hello),项目是一个多进程项目,主程序叫父进程,fork创原创 2021-08-28 15:43:03 · 700 阅读 · 0 评论 -
waitpid函数的介绍
1.wait和waitpid的差别(1)基本功能是一样的,都是用来回收子进程的(2)waitpid可以回收指定PID的子进程(3)waitpid可以阻塞式和非阻塞式两种工作模式2.waitpid原型介绍pid_t waitpid(pid_t pid, int *wstatus, int options);(1)参数1:要回收子进程的PID号,参数2:和wait的参数一样,参数三:选择阻塞和非阻塞两种工作模式(0阻塞,WNOHANG 非阻塞)(2)返回值:返回回收的子进程的PID3.代码实现原创 2021-08-28 11:37:13 · 1300 阅读 · 0 评论 -
进程的诞生和消亡及wait函数的使用
1.进程的诞生(1)进程0(内核态)和进程1(init进程)(2)fork(3)vfork2.进程的消亡(1)正常终止和异常终止(2)进程在运行时需要消耗系统资源(内存、IO),进程终止时理应完全释放这些资源(如果进程消亡后任没有释放相应的资源则这些资源就丢失了)(3)linux设计规定;每个进程退出时,操作系统会自动回收这个进程涉及到的所有资源(譬如malloc申请的内存没有free时,当进程结束会释放这个内存),但操作系统只是回收了这个进程工作时消耗的内存和IO,而且没有回收这个进程本身占原创 2021-08-28 10:56:29 · 188 阅读 · 0 评论 -
父子进程对文件的操作
1.子进程继承父进程中打开的文件#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>int main(void){ int fd = -1; pid_t pid = -1; fd = ope原创 2021-08-26 17:06:26 · 762 阅读 · 0 评论 -
进程的引入和fork函数创建子进程
1.什么是进程(1)动态过程而不是静态实物(2)进程就是一个静态的一个可执行程序a.out的一次运行过程(./a.out运行到结束)就是一个进程。(3)进程控制块(PCB),内核中专门管理一个进程的数据结构。2.进程ID(1)ps -aux查看当前系统所有进程(2)getpid(获取当前进程pid号)、getppid(获取父进程pid号)、getuid(当前进程的用户ID)、geteuid(获取当前组ID)、getgid(获取当前有效用户ID)、getegid(获取当前有效组ID)#inclu原创 2021-08-26 16:14:39 · 162 阅读 · 0 评论 -
进程环境的理解
1.环境变量(1)export命令查看环境变量(2)进程环境表(其实是一个字符串数组,用environ这个全局变量指向它)介绍:每一个进程中都有一份所有环境变量构成的一个表格,也就是当前进程可以直接使用这些环境变量。(3)程序中通过environ全局变量使用环境变量#include <stdio.h>int main(void){ int i = 0; extern char **environ; while(NULL != env原创 2021-08-26 14:32:47 · 164 阅读 · 0 评论 -
程序的开始和结束
1.main函数由谁调用(1)编译链接时的引导代码:操作系统性在执行main函数前其实也要先执行一段引导代码才能执行main,链接时由连接器将编译器中事先准备好的引导代码给链接进去和我们的应用程序一起构成最终的可执行程序。gcc -v 要编译的文件来查看编译链接时里面的内容(2)运行时的加载器:加载器是操作系统中的程序,当我们执行一个程序时(譬如./a.out,譬如代码中用exec族函数来运行时)加载器负责将这个程序加载到内存中去执行这个程序。(3)程序在编译时用到链接器,运行时用加载器,这两个原创 2021-08-26 13:51:25 · 817 阅读 · 0 评论 -
proc文件系统的介绍与使用
1.操作系统级别的调试(1)简单程序单步调试(2)复杂程序printf打印信息调试(3)框架体系日志记录信息调试(4)内核调试的困境2.proc虚拟文件系统的工作原理(1)proc文件系统的思路:在内核中构建一个虚拟文件系统、proc,内核在运行时,将自己的一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中,这样相当于将不可见的内核中的数据结构以可视化的方式呈现在内核开发者面前。(2)proc文件系统给了开发者一种调试内核的方法,通过观察/proc/xxx文件,来观看内核中特原创 2021-08-25 11:00:54 · 664 阅读 · 0 评论 -
linux中创建随机数
1.linux中随机数相关库函数(1)连续多次调用rand函数可以返回一个伪随机数序列。(2)srand函数用来设置rand获取的伪随机数序列的种子。(3)单纯使用rand来得到伪随机数有缺陷每次执行程序得到的随机序列是相同的,原因是rand内部算法其实是通过一个种子(seed,其实就是一个int类型的原始参数),默认seed为1,种子一定算法也是一定,那么每次得到的伪随机数序列肯定是一样的,所以用srand函数来设置种子.#include <stdio.h>#include <原创 2021-08-25 09:42:05 · 329 阅读 · 0 评论 -
linux系统中的时间
1.jiffies的引入(1)jiffies是Linux中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值。(2)内核配置的时候定义了一个节拍时间,实际上linux内核的调度系统工作时就是以这个节拍时间为时间片的。(3)jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1,然后拿到了系统的任意一个时间我们当前时间就被jiffies这个变量所标注。2.linux系统如何记录时间(1)内核在开机启动时会读取RTC硬件获取一个时间作为初始基准时间,原创 2021-08-24 15:37:36 · 795 阅读 · 0 评论 -
读取目录文件
1.opendir与readdir库函数(1)opendir打开一个目录后得到一个DIR类型的指针给readdir函数使用。DIR *opendir(const char *name);(2)readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(就是目录中的一个子文件)(3)readdir调用一次只能返回一个目录项,想要读出目录中所有的目录项必须多次调用这个函数,且readdir函数内部户记录了那个目录项未读,所原创 2021-08-23 11:27:00 · 361 阅读 · 0 评论 -
文件权限管理
1.ls -l 打印出来的权限列表(1)一个文件有9位权限,3个为一组,第一组表示文件的属主(user、owner)对该文件的可读可写可执行权限,第二组表示属主所在组(group)的这些权限,第3组表示其他用户(others)对该文件的这些权限。(2)属主就是这个文件属于谁,一般来说文件属主就是创建该文件时用的那个用户,但是我们创建之后还可以用chown命令改变文件的属主,还可以用chgrp修改一个文件的所在组。2.文件操作时的权限检查规则(1)一个程序a.out被执行,a.out试图去操作一个文件原创 2021-08-23 10:34:55 · 172 阅读 · 0 评论 -
常用的文件属性
1.常用文件属性获取(3)每个文件都附带了这个文件的属性(属性信息是存在于文件本身的,但它不能项文件内容一样可以被vi打开查看,只能被专门的API打开查看)(2)常用的查看文件属性的API:stat、fstat、lstat这三个函数作用一样,参数不同,细节略有不同。int stat(const char *pathname, struct stat *statbuf);int fstat(int fd, struct stat *statbuf);int lstat(const char *pat原创 2021-08-18 22:09:27 · 584 阅读 · 0 评论 -
标准IO库介绍与简单使用
1.标准IO和文件IO有什么区别(1)看起来都是函数,但是标准IO是C库函数,而文件IO是linux下的API。(2)C语言库函数是由API封装而来的。库函数内部也是通过调用API来完成操作的,但是库函数因为多了一层封装,所以比API要更加好用一些。(3)库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。所以C库函数具有可移植性而API不具有可移植性。(4)性能上和易用性上看,C库函数一般要好一些。譬如IO,文件IO是不带缓存的,而标准原创 2021-08-18 11:46:37 · 184 阅读 · 0 评论 -
fcntl函数的介绍与使用
1.fcntl函数的原型和作用(1)fcntl函数是一个多功能文件管理的工具箱,接收两个参数和一个变参。int fcntl(int fd, int cmd, ... /* arg */ );参数1:文件描述符,要操作的那个文件参数2:要进行的命令操作变参:是用来传递参数的,配合cmd使用(2)cmd的样子类似于F_XXX,不同的cmd有不同的功能,学会查man手册。2.fcntl常用的cmd(1)F_DUPFD这个cmd的作用是复制文件描述符(作用类似于dup和dup2),从可用的fd数字原创 2021-08-18 10:28:28 · 918 阅读 · 0 评论 -
文件描述符的复制(dup2)
1.使用dup2进行文件描述符的复制(1)dup2和dup的作用是一样的,都是复制一个新的文件描述符,但是dup2允许用户指定新的文件描述符数字。int dup2(int oldfd, int newfd);第一个参数:久的文件描述符第二个参数新的文件描述符返回值:返回这个新的文件描述符#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h&g原创 2021-08-17 20:32:55 · 193 阅读 · 0 评论 -
文件描述符的复制(dup)
1.dup和dup2函数的介绍int dup(int oldfd);返回一个文件描述符,参数是要复制的那个文件描述符。2.使用dup进行文件描述符的复制(1)dup系统调用对fd进行复制,会返回一个新的文件描述符,(譬如原来的是3,返回的是4(返回一个最小的空的文件描述符))(2)dup不能指定返回的文件描述符而是按系统分配原则返回fd,就是返回一个最小的空的文件描述符。(3)dup返回的fd和原来的oldfd都指向原来oldfd打开的那个动态文件,实现了文件共享。(4)dup返回的fd和原原创 2021-08-17 20:01:08 · 1002 阅读 · 0 评论 -
文件共享的实现
1.什么是文件共享文件共享就是同一个文件(是指同一个inode,同一个pathname),被多个独立的读写体(多个文件描述符)去同时操作。2.问什么需要文件共享通过文件共享实现多线程同时操作一个大文件,以减少读写时间,提高效率。3.文件共性的方式(1)文件共享的核心,如何弄出不同的文件描述符指向同一个文件。(2)常见的三种文件共享的情况:1是同一个进程中多次使用open打开同一个文件,2是在不同进程中分别使用open打开同一个文件(这时两个fd可能相同),3是linux中提供了dup和dup2两原创 2021-08-17 17:52:04 · 381 阅读 · 0 评论 -
重复打开同一文件与O_APPEND
3.1.9.多次打开同一文件与O_APPEND3.1.9.1、重复打开同一文件读取(1)一个进程中两次打开同一个文件,然后分别读取,看结果会怎么样(2)结果无非2种情况:一种是fd1和fd2分别读,第二种是接续读。经过实验验证,证明了结果是fd1和fd2分别读。(3)分别读说明:我们使用open两次打开同一个文件时,fd1和fd2所对应的文件指针是不同的2个独立的指针。文件指针是包含在动态文件的文件管理表中的,所以可以看出linux系统的进程中不同fd对应的是不同的独立的文件管理表。3.1.9.2原创 2021-08-17 17:07:57 · 327 阅读 · 0 评论 -
多线程简介
1.多线程就是操作系统的并行执行机制(1)并行就是说多个认个任务同时被执行,并分为宏观上和微观上的并行。(2)理论上讲单核CPU只有一个核心,同时只能执行一条指令,这种CPU只能实现宏观上的并行,微观上一定是串行。多核CPU宏观和微观上都能实现并行。2.进程与线程的区别于联系(1)进程和线程是操作系统两种不同的软件技术,目的是实现宏观上的并行(通俗讲就是让多个程序在同一机器上同时运行)。(2)进程和线程在实现并行的原理不同,而且这个差异和操作系统有关。在windows下面进程和线程的差异较大,而在原创 2021-08-17 17:01:03 · 157 阅读 · 0 评论 -
lssek函数的用法及作用
1.lseek函数的介绍(1)文件指针:当我们对一个文件读写时,一定需要打开这个文件,所以我们操作的都是动态文件,动态文件在内存中的形态就是流的形式。(2)文件流很长,里面有很多字节。那我们操作的是哪一个位置,GUI模式下就是用光标来标识,在动态文件中,我们通过文件指针来表示正在操作的位置。文件指针其实就是vnode里的一个元素。这个指针表示我们操作的位置,在linux中用lseek来访问这个指针。(3)write和read函数本身自带移动文件指针的功能,所以打开一个有n字节的文件,read/writ原创 2021-08-16 21:37:32 · 4660 阅读 · 0 评论 -
linux系统中如何管理文件
1.硬盘中的静态文件和inode(1)文件平时都是存储在硬盘内,以固定的形式存在硬盘内,叫静态文件。(2)一块硬盘中可以分为两大区域:一个是硬盘内容管理表项,另一个是真正存储内容的区域操作系统是通过这个表来找到我们想要的文件。(3)操作系统最初拿到的是文件名,最终得到的是文件内容。第一步就是去查找内容管理表,这个表记录了文件的各种信息,每一个文件有一个信息列表我们叫inode,i节点是个结构体,这个结构体记录了文件名,文件所在扇区,块号等。注意:硬盘管理是以文件为单位,每个文件一个inode(实质是原创 2021-08-15 15:57:15 · 73 阅读 · 0 评论 -
文件读写的细节
1.errno和perror(1)errno就是error number 就是错误号码,linux中对各种错误进做了编号,当函数执行错误时函数会返回一个errno特定的编号来告诉我们函数哪里错了。(2)errno是操作系统维护的一个全局变量,任何OS内部函数都可以通过设置errno来告诉上层应用者发生了什么错误。(3)errno本身是一个int型数字,每个数字对应一种错误,不适用于操作者看,于是提供了一个函数perror(printf error),这个函数会从内部读取errno的数字,并直接转成对应原创 2021-08-15 15:11:16 · 81 阅读 · 0 评论 -
linux下文件的读写操作讲解(及open函数的flags讲解)
1.文件的读写代码演示:#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <string.h>int main(void){ int fd = -1; char readBuf[100] = {0}; char原创 2021-08-15 14:28:43 · 696 阅读 · 0 评论 -
文件IO的描述及操作步骤
1.什么是文件IO:IO就是input/output,输入输出。文件IO就是读写文件。2.文件操作的主要接口API(1)API是一些函数,这些函数是由linux系统提供支持的,由应用程序程序来使用。(2)应用层程序通过调用API来调用操作系统中的各种功能来干活。(3)学习一个操作系统,其实就是学习这个操作系统的API.3.常用的文件IO接口open、close、write、read、lseek4.文件操作的一般步骤(1)一般先open打开一个文件,得到文件描述符,在对文件进行读写操作,完成原创 2021-08-14 11:01:35 · 2537 阅读 · 0 评论