![](https://img-blog.csdnimg.cn/ec38a3524ab842ac85bc97abce16c616.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
朱老师网络编程学习
文章平均质量分 72
linux 网络编程学习
大漠飞鹰6666
这个作者很懒,什么都没留下…
展开
-
《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2
(4)accept,返回值是一个fd,accept正确返回就表示我们已经和前来连接我的客户端之间建立了一个TCP连接了,以后我们就要通过这个连接来和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了。每一个数据包将来在网络上传递的时候,内部都包含了发送方和接收方的信息(就是IP地址和端口号),所以IP地址和端口号这两个往往是打包在一起不分家的。socket返回的fd叫做监听fd,是用来监听客户端的,不能用来和任何客户端进行读写。(2)整个连接的通信就是由N多个回合组成的。原创 2023-07-17 20:30:29 · 348 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》 inet_addr inet_ntop inet_pton htons
(1)CS架构介绍(client server,客户端(client ) 服务器(server)架构: QQ、迅雷、)(1)inet_aton、inet_addr、inet_ntoa : IP地址转换,这三函数 不支持 IPV6。(2)BS架构介绍(broswer server,浏览器服务器架构 : 优酷网站(不是APP)、)(5)发送方会给各分割报文编号,接收方会校验编号,一旦顺序错误即会重传。(1)TCP协议工作在传输层,对上服务socket接口,对下调用IP层。原创 2023-07-13 20:29:22 · 281 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第8部分-3.8.网络基础》 3.8.1.网络通信概述 3.8.3.网络通信基础知识2
(5)我们访问一个网站的流程是:先使用IP地址(譬如谷歌的DNS服务器IP地址为8.8.8.8)访问DNS服务器(DNS服务器不能是域名,只能是直接的IP地址),查询我们要访问的域名的IP地址,然后再使用该IP地址访问我们真正要访问的网站。(3)路由器对内管理子网(局域网),可以在路由器中设置子网的网段,设置有线端口的IP地址,设置dhcp功能等,因此局域网的IP地址是路由器决定的。当局域网中的主机要发送数据包给外网时,路由器要负责将数据包头中的局域网主机的内网IP替换为当前局域网的对外外网IP。原创 2023-07-11 22:20:34 · 439 阅读 · 0 评论 -
3.7.6.线程同步之互斥锁 3.7.7.线程同步之条件变量
注意:man pthread_mutex_init时提示找不到函数,说明你没有安装pthread相关的man手册。pthread_cond_signal/pthread_cond_broadcast 这两个都是 唤醒 条件变量。pthread_mutex_destroy 删除互斥锁。pthread_mutex_init 初始化互斥锁。pthread_mutex_lock 互斥锁 上锁。3.7.7.1、什么是条件变量: 条件变量 跟 互斥锁 有关系的 ,(1)互斥锁又叫互斥量(mutex)原创 2023-07-12 19:08:48 · 94 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第7部分-3.7.linux线程全解》3.7.2.线程的引入 pthread_create 创建 子线程 3.7.4_5.线程同步之信号量 sem_init
3.7.1.再论进程3.7.1.1、多进程实现同时读取键盘和鼠标运行结果:3.7.1.2、使用进程技术的优势(1)CPU时分复用,单核心CPU可以实现宏观上的并行(2)实现多任务系统需求(多任务的需求是客观的)3.7.1.3、进程技术的劣势(1)进程间切换开销大(2)进程间通信麻烦而且效率低3.7.1.4、解决方案就是线程技术(1)线程技术保留了进程技术实现多任务的特性。(2)线程的改进就是在线程间切换和线程间通信上提升了效率。(3)原创 2023-07-05 21:37:37 · 55 阅读 · 0 评论 -
3.6.6.异步SIGIO : fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN) 3.6.7.存储映射IO
* 此时fd 就是 mouse1 ,从fd (mouse1)中 读取 5 个 字节,放到 buf 中 *//* 从文件描述符 0 (0就是标准输入) 中 读取 2 个 字节,放到 buf 中 *//* mousefd 文件描述符 flag 添加 O_ASYNC :可以接收异步通知*/if (mousefd < 0) /* open 返回的 fd 小于 0,说明打开错误 *//* 清空 buf */原创 2023-06-29 20:37:45 · 540 阅读 · 0 评论 -
3.6.4.IO多路复用原理 IO multiplexing : select和poll
3.6.4.2、select函数介绍 和 3.6.4.3、poll函数介绍。3.6.4.IO多路复用原理 IO multiplexing。3.6.5.1、用select函数实现同时读取键盘鼠标。3.6.5.2、用poll函数实现同时读取键盘鼠标。(3)select和poll :这两个功能一样。外部阻塞式,内部非阻塞式自动轮询多路阻塞式IO。(2)用在什么地方?select和poll 是阻塞式的,3.6.4.1、何为IO多路复用。3.6.5.IO多路复用实践。原创 2023-06-28 22:56:02 · 42 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第3部分-3.6.高级IO》3.6.1.非阻塞IO 3.6.2.阻塞式IO的困境 3.6.3.并发式IO的解决方案 O_NONBLOCK
当 程序中同时读取键盘和鼠标时,因为都是 阻塞 式 的, 只能按照 程序的顺序,先读取鼠标,在读取键盘, 我们实际使用时,并不是这样的,所有这是 阻塞式的 困境!/* 此时fd 就是 mouse1 ,从fd (mouse1)中 读取 5 个 字节,放到 buf 中 */if (fd < 0) /* open 返回的 fd 小于 0,说明打开错误 *///read 这个函数默认是 阻塞的, 如果我们不按键盘的 话,程序一直阻塞在这里。(2)阻塞式的好处:有利于操作系统性能的发挥,原创 2023-06-28 21:11:07 · 45 阅读 · 0 评论 -
3.5.4.alarm和pause函数
pause函数的作用就是让当前进程暂停运行,交出CPU给其他进程去执行。当当前进程进入pause状态后当前进程会表现为“卡住、阻塞住”,要退出pause状态当前进程需要被信号唤醒。2. 多次 执行 alarm() , 最后的 alarm 会覆盖 前面的 alarm。3.5.4.1、alarm函数: 内核提供的 闹钟,时间到了,会帮我们执行一个函数。让当前 cpu 挂起, 并交出 cpu 的运行权限。cpu 被当前进程一直占用,3.5.4.alarm和pause函数。(1)内核以API形式提供的闹钟。原创 2023-06-27 22:07:20 · 80 阅读 · 0 评论 -
3.5.1.什么是信号 signal sigaction
sigaction比signal好的一点:sigaction可以一次得到设置新捕获函数和获取旧的捕获函数(其实还可以单独设置新的捕获或者单独只获取旧的捕获函数),而signal函数不能单独获取旧的捕获函数而必须在设置新的捕获函数的同时才获取旧的捕获函数。本节介绍什么是信号,以及信号由谁发送、由谁处理,怎么处理的问题,目的是站在一定高度上认识信号的作用和意义。本节介绍进程对信号的三种处理方法,signal函数和sigaction函数用来捕获信号时的差异。(1)信号的目的:用来通信 (当前进程的通讯途径)原创 2023-06-27 20:24:31 · 100 阅读 · 0 评论 -
3.4.17.linux的进程间通信概述 3.4.18.linux的IPC机制1-管道 3.4.19.SystemV IPC介绍
(2)有名管道的使用方法:固定一个文件名,2个进程分别使用mkfifo创建fifo文件,然后分别open打开获取到fd,然后一个读一个写。复杂、大型的程序,因为设计的需要就必须被设计成多进程程序(我们整个程序就设计成多个进程同时工作来完成的模式),常见的如GUI、服务器。(2)管道通信的方法:父进程创建管理后fork子进程,子进程继承父进程的管道fd。(1)管道通信的原理:内核维护的一块内存,有读端和写端(管道是单向通信的)进程 1 和 进程 2 的通讯: 进程 1 只有 写, 进程 2 只有 读。原创 2023-05-25 20:52:29 · 78 阅读 · 0 评论 -
3.4.16.让程序不能被多次运行
(1)因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。意思就是说当我们./a.out去运行程序时,如果当前还没有这个程序的进程运行则运行之,程序在执行之初去判断一个特定的文件是否存在,若存在则标明进程已经在运行,若不存在则标明进程没有在运行。如果之前已经有一个这个程序的进程在运行则本次运行直接退出(提示程序已经在运行)。,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。(2)这个特定文件要古怪一点,确保不会凑巧真的在电脑中存在的。原创 2023-05-25 07:34:13 · 49 阅读 · 0 评论 -
3.4.15.使用syslog来记录调试信息
LOG_CONS 当我们的写日志文件,日志文件损坏或写不进去,就会把 错 误,直接 输出到 当前控制台,如果没有出错,就输出到日志信息。/* "789.out" (随便给的)当前程序的命令,NULL也可以,*/LOG_PID 发的每一条日志信息,就会包含当前进程 的 pid。LOG_CRON : 时间 相关的。原创 2023-05-24 21:46:34 · 85 阅读 · 0 评论 -
3.4.12.进程关系, 3.4.13.守护进程的引入, 3.4.14.编写简单守护进程
可以给我们提供某种服务(譬如nfs服务器给我们提供nfs通信方式),当我们程序需要这种服务时我们可以调用服务器程序(和服务器程序通信以得到服务器程序的帮助)来进程这种服务操作。(2)cron,cron进程用来实现操作系统的时间管理,linux中实现定时执行程序的功能就要用到cron。父进程 open 打开了一个文件,父进程 fork, 就会把 打开的文件 继承给 子进程。daemon,表示守护进程,简称为d(进程名后面带d的基本就是守护进程)(3)进程组(group): 由若干进程构成一个进程组。原创 2023-05-24 20:18:29 · 33 阅读 · 0 评论 -
3.4.10.exec族函数及实战2
main函数的原型其实不止是int main(int argc, char **argv),(2)如果用户在执行这个程序时没有传递第三个参数,则程序会自动从父进程继承一份环境变量(/* 当不给 execl 命令路径时,返回值 -1, 代表execl 执行错误 *//* 如果当前目录下有 ls 命令, execl 不传命令路径 也可以执行 */,则程序中的实际环境变量是我们传递的这一份(取代了默认的从父进程继承来的那一份)默认的,最早来源于OS中的环境变量, 例如上面的 ./hello。原创 2023-05-18 21:50:31 · 90 阅读 · 0 评论 -
3.4.9.exec族函数及实战1
如果exec没有找到path这个文件则直接报错),而加了p的传递的可以是file(也可以是path,只不过兼容了file。加了p的这两个函数会首先去找file,如果找到则执行执行,如果没找到则会去环境变量PATH所指定的目录下去找,如果找到则执行如果没找到则报错),因为我们只能把子进程程序的源代码贴过来执行(必须知道源代码,而且源代码太长了也不好控制)(kill -9 +pid 发信号关掉子进程 ),和基本版本的exec的区别就是:执行可执行程序时会多传一个环境变量的字符串数组给待执行的程序。原创 2023-05-18 07:50:28 · 84 阅读 · 0 评论 -
3.4.8.waitpid(等待指定子进程的pid)介绍
等待回收PID为pid的这个子进程,如果当前进程并没有一个ID号为pid的子进程,则返回值为-1;-1表示不等待某个特定PID的子进程而是回收任意一个子进程,0表示用默认的方式(阻塞式)来进行等待,返回值ret是本次回收的子进程的PID。/* 这里一定是 子进程 , 子进程先结束,成为僵尸进程 ,一定要保证子进程先结束 */printf("子进程已经被回收,子进程pid = %d \n", ret);把 sleep 加入到 父进程 ,让子进程先结束,子进程进入僵尸进程后 ,父进程 去回收。原创 2023-05-17 21:39:06 · 1593 阅读 · 0 评论 -
3.4.7.父进程wait回收子进程
(2)wait的返回值pid_t,这个返回值就是本次wait回收的子进程的PID。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。对wait做个总结:wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态。让父进程可以及时的去回收僵尸子进程。父进程调用wait函数后阻塞。原创 2023-05-17 13:01:44 · 135 阅读 · 0 评论 -
3.4.6.进程的诞生和消亡
每一个进程退出时,操作系统会自动回收这个进程涉及到的所有的资源(譬如malloc申请的内容没有free时,当前进程结束时这个内存会被释放,譬如open打开的文件没有close的在程序终止时也会被关闭)(2)linux系统规定:所有的孤儿进程都自动成为一个特殊进程(进程1,也就是init进程)的子进程。,此时父进程结束时一样会回收子进程的剩余待回收内存资源。所有的 孤儿进程 的 父进程 就是进程1 init进程。父进程先于子进程结束,子进程成为一个孤儿进程。父进程先于子进程结束,子进程成为一个孤儿进程。原创 2023-05-16 08:23:37 · 61 阅读 · 0 评论 -
3.4.5.父子进程对文件的操作 open 子进程最终目的是要独立去运行另外的程序
本质原因就是因为fork内部实际上已经复制父进程的PCB生成了一个新的子进程,并且fork返回时子进程已经完全和父进程脱离并且独立被OS调度执行。原因是父子进程分离后才各自打开的1.txt,这时候这两个进程的PCB已经独立了,文件表也独立了,因此2次读写是完全独立的。实际上本质原因是父子进程之间的fd对应的文件指针是彼此关联的(很像O_APPEND标志后的样子)实际测试结果标明O_APPEND标志可以把父子进程各自独立打开的fd的文件指针给关联起来,实现分别接续写。子进程继承父进程中打开的文件。原创 2023-05-15 23:17:24 · 60 阅读 · 0 评论 -
3.4.4.fork创建子进程
(4)典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。)fork的返回值在子进程中等于0,在父进程中等于本次fork创建的子进程的进程ID。k函数调用一次会返回2次,返回值等于0的就是子进程,而返回值大于0的就是父进程。如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个。(1)每一次程序的运行都需要一个进程。拿老进程 来复制 一个 新进程。现有的进程来复制生成一个新进程。(2)多进程实现宏观上的并行。复制生成的新进程叫子进程。原创 2023-05-15 22:36:42 · 103 阅读 · 0 评论 -
3.4.3.进程的正式引入 getpid 和 getppid
getuid 获取当前进程的用户(root/aston/)ID 、geteuid (有效用户 ID ) 、getgid 获取当前进程 组 ID 、getegid (有效组 ID )(3)进程控制块PCB(process control block),内核中专门用来管理一个进程的数据结构。一个静态的可执行程序a.out的一次运行过程(./a.out去运行到结束)就是一个进程。getpid 获取进程ID、getppid 获取父进程ID。给每个进程 分配的一个唯一的数字标号,来标识 这个进程。原创 2023-05-15 20:55:22 · 132 阅读 · 0 评论 -
3.4.2.进程环境 environ
setenv : 设置环境变量, 当前进程的环境变量,你只能删除你当前进程的环境变量。操作系统很重要的就是 虚拟地址 ,虚拟地址到物理地址的映射(linux 、windows)每一个进程中都有一份所有环境变量构成的一个表格,也就是说我们当。所以一旦程序中用到了环境变量那么程序就和操作系统环境有关了。(2)每个进程的逻辑地址空间均为4GB(32位系统)所有的应用程序都是从 0 地址(虚拟地址)开始的,(1)操作系统中每个进程在独立地址空间中运行。(3)0-1G为OS, 1-4G为应用。原创 2023-05-15 12:44:00 · 70 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第4部分-3.4.linux进程全解》3.4.1.程序的开始和结束 atexit();
本节首先介绍waitpid和wait函数的差别,然后实战演示了waitpid函数的3种常见用法,最后简单讲解了竟态的概念。本节讲解wait函数回收子进程的信号式异步通信工作原理,并且实战演练了使用wait来回收子进程的过程。本节正式引入进程的概念,讲述了进程的ID以及获取进程ID的函数,多进程调度实现宏观上并行的原理。本节讲述进程的诞生和消亡过程,着重讲了僵尸进程和孤儿进程的概念,进程资源回收和状态返回等。本节讲解进程的环境变量和虚拟地址空间,这些都是一个进程在系统中运行时的外部环境。原创 2023-05-13 08:00:45 · 44 阅读 · 0 评论 -
3.3.6.proc文件系统介绍
而且刚开始的时候内核管理者对proc目录的使用也没有什么经验也没什么统一规划,后来的结果就是proc里面的东西又多又杂乱。(2)项kernel这样庞大的项目,给里面添加/更改一个功能是非常麻烦的,因为你这添加的一个功能可能会影响其他已经有的。proc文件系统给了开发者一种调试内核的方法:我们通过实时的观察/proc/xxx文件,来观看内核中特定数据结构的值。将内核中一些关键的数据结构以文件的方式呈现在/proc目录中的一些特定文件中。于将不可见的内核中的数据结构以可视化的方式呈现给内核的开发者。原创 2023-05-12 21:45:48 · 87 阅读 · 0 评论 -
3.3.5.linux中使用随机数 srand
(1)单纯使用rand重复调用n次,就会得到一个0-RAND_MAX之间的伪随机数,如果需要调整范围,可以得到随机数序列后再进行计算。(1)linux系统收集系统中的一些随机发生的事件的时间(譬如有人动鼠标,譬如触摸屏的操作和坐标等)作为随机种子去生成随机数序列。(2)单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列。rand内部默认是使用1作为seed的,种子一定的算法也是一定的,那么每次得到的伪随机序列肯定是同一个。3.3.5.1、随机数和伪随机数。原创 2023-05-12 20:04:13 · 549 阅读 · 0 评论 -
3.3.4.时间相关API实战2 mktime asctime
/ localtime() 传一个 time_t tNow, 得到了一个 struct tm tmNow 的结构体信息。(2)有时候我们程序希望得到非常精确的时间(譬如以us为单位),这时候就只能通过gettimeofday来实现了。(1)前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间。(1) asctime得到一个固定格式的字符串格式的当前时间,效果上和ctime一样的。(1)asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式。原创 2023-05-12 19:12:01 · 109 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第3部分-3.3.获取系统信息》-3.3.1.关于时间的概念 - 3.3.2.linux系统中的时间 -3.3.3.时间相关API实战1
localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday有9个:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday。(6)总结:不管用哪个系统调用,最终得到的时间本质上都是一个时间(这个时间最终都是从kernel中记录的jiffies中计算得来的),只不过不同的函数返回的时间的格式不同,精度不同。实践证明我们的猜测是正确的。原创 2023-05-12 12:26:56 · 48 阅读 · 0 评论 -
3.2.6.读取目录文件
库函数中有一些函数当年刚开始提供时都是不可重入的,后来意识到这种方式不安全。,所以重新封装了C库,提供了对应的可重复版本(一般是不可重入版本函数名_r)opendir打开一个目录后得到一个DIR类型的指针给readdir使用。当readdir函数返回NULL时就表示目录中所有的目录项已经读完了。readdir函数和我们前面接触的一些函数是不同的。readdir调用一次只能读出一个目录项。(所谓目录项就是目录中的一个子文件)调用后不会重复返回已经返回过的目录项。不可重入 函数是有一定风险的!原创 2023-05-11 20:41:29 · 84 阅读 · 0 评论 -
3.2.5.文件权限管理2
chmod 命令在 可以执行 属主 目录下的1.txt文件!(2)chmod命令其实内部是用linux的一个叫chmod的API实现的。2.增加 | 组 可读 | 组 可写 | 组 可执行。umask的作用是用来设定我们系统中新创建的文件的默认权限的。chmod是一个linux命令,用来修改文件的各种权限属性。(1) 文件掩码是linux系统中维护的一个全局设置,(2)chown命令是用chown API实现的。3. 增加 其他用户 可读、可写、可执行。如果我 root 用户 呢?原创 2023-05-11 19:21:42 · 183 阅读 · 0 评论 -
3.2.4.文件权限管理1
(1)st_mode本质上是一个32位的数(类型就是unsinged int),这个数里的每一个位表示一个含义。第一组三个表示文件的属主(owner、user)对该文件的可读、可写、可执行权限。2组3个位表示文件的属主所在的组(group)对该文件的权限!2组3个位表示文件的属主所在的组(group)对该文件的权限。学linux 的应用编程就是学linux 的API。(3)刚才上面说的是我的分析,到底对不对还得验证。表示其他用户(others)对该文件的权限。,也就是当前程序(进程)是哪个用户的进程。原创 2023-05-11 08:04:16 · 16 阅读 · 0 评论 -
3.2.3.stat函数的应用案例
(2)linux并没有给文件权限测试提供宏操作,而只是提供了位掩码,所以我们只能用位掩码来自己判断是否具有相应权限。返回1 :代表具有 读取 的权限。chmod u-r 1.txt 就是把 1.txt 可读权限去掉。chmod u+r 1.txt 就是把 1.txt 可读权限加上。S_IRUSR 返回0 :代表不具有 读取 的权限。这个东西有很多个标志位共同构成,记录了很多信息,,这个元素其实是一个按位来定义的一个位标志((1)文件类型就是-、d、l····,如果文件不是普通文件则返回值是0.原创 2023-05-09 13:15:17 · 98 阅读 · 0 评论 -
3.2.2.常用文件属性获取
(1)struct stat是内核定义的一个结构体,在中声明,所以我们可以用。(1)每个文件中都附带了这个文件的一些属性(属性信息是存在于文件本身中的,但是它不像文件的内容一样可以被vi打开看到,这个API的作用就是让内核将我们要查找属性的文件的属性信息结构体的值放入我们传递给stat函数的buf中。stat 是从文件名出发,得到文件属性信息。内核返回的时候buf中就被填充了文件的正确的属性信息。常用文件属性获取:什么时候被创建的、信息、、、、不是 man 1 stat!原创 2023-05-08 13:26:27 · 37 阅读 · 0 评论 -
《3.linux应用编程和网络编程-第2部分-3.2.文件属性》-3.2.1.linux中各种文件类型
常见的.c文件, .h文件 .txt文件等都是文本文件。常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin)都是二进制文件。),所以我们无法从文件本身准确知道文件属于哪种,我们只能本来就知道这个文件的类型然后用这种类型的用法去用他。文件中的内容是由文本构成的,文本指的是ASCII码字符(也有可能是别的编码)。拟文件系统中的文件大多数不能或者说不用直接读写的,而是用一些特殊的API产生或者使用的,linux中是使用特殊的一些API来专门读写文件夹的。原创 2023-05-08 07:33:51 · 35 阅读 · 0 评论 -
3.1.14.标准IO库介绍
(3)库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。譬如IO,文件IO是不带缓存的,而标准IO是带缓存的,因此标准IO比文件IO性能要更高。//读文件 ,char 类型占 1 个字节, 读10个字节, 去fp文件里读。(1)常见的标准IO库函数有:fopen、fclose、fwrite、fread、ffulsh(刷新,先写到缓存区,len = fwrite("abcde", 1, 5, fp);//"r+" 读文件。原创 2023-05-08 06:30:00 · 227 阅读 · 0 评论 -
3.1.13.fcntl函数介绍
这个cmd的作用是复制文件描述符(作用类似于dup和dup2),这个命令的功能是从可用的fd数字列表中找一个比arg(可变参数)大或者和arg(可变参数)一样大的数字作为oldfd的一个复制的fd,和dup2有点像但是不同。(1)fcntl函数是一个多功能文件管理的工具箱,接收2个参数+1个变参。其他的当我们在使用中碰到了一个fcntl的不认识的cmd时再去查man手册即可。(2)cmd的样子类似于F_XXX,不同的cmd具有不同的功能。dup2返回的就是我们指定的那个newfd ,否则就会出错;原创 2023-05-07 08:00:00 · 174 阅读 · 0 评论 -
dup2进行文件描述符复制
(1)linux中的shell命令执行后,打印结果都是默认进入标准输出(stdout)的(本质上是因为这些命令譬如ls、pwd等都是调用printf进行打印的),所以我们可以在linux的终端shell中直接看到命令执行的结果。(1)dup2复制的文件描述符,和原来的文件描述符虽然数字不一样,但是这连个指向同一个打开的文件。(2)交叉写入的时候,结果是接续写(实验证明的)。(1)dup2和dup的作用是一样的,都是复制一个新的文件描述符。3.1.12.文件描述符的复制2。原创 2023-05-06 21:51:07 · 196 阅读 · 0 评论 -
3.1.11文件描述符的复制 dup
(1)dup系统调用对fd进行复制,会返回一个新的文件描述符(譬如原来的fd是3,返回的就是4,我们这个程序不可能返回一个5,系统会把一个最小的空的返回一个文件描述符)(3)dup返回的fd和原来的oldfd都指向oldfd打开的那个动态文件,操作这两个fd实际操作的都是oldfd打开的那个文件。(4)dup返回的fd和原来的oldfd同时向一个文件写入时,结果是分别写还是接续写?验证1:dup返回的fd和原来的oldfd同时向一个读文件时,结果是分别。dup并不能指定分配的新的文件描述符的数字。原创 2023-05-06 13:13:42 · 136 阅读 · 0 评论