文件描述符复制和重定向
文件描述符复制和重定向文档转自:文件描述符复制与重定向
一、dupdup函数的作用是复制文件描述符,这样就有多个文件描述符可以指向同一个文件了。函数原型如下:
12#include <unistd.h>int dup(int oldfd);
参数:oldfd是要被复制的文件描述符
返回值:函数调用成功返回被复制出的文件描述符,调用失败返回 -1
下图展示了,dup()函数具体行为, 这样不过使用 fd1还是使用fd2都可以对磁盘文件A进行操作了
被复制出的新文件描述符是独立于旧的文件描述符的,二者没有连带关系。也就是说当旧的文件描述符被关闭了,复制出的新文件描述符还是可以继续使用的。
示例:
通过dup()函数进行文件描述符复制, 并验证了复制之后两个新、旧文件描述符是独立的,二者没有连带关系
12345678910111213141516171819202122232425262728293031323334353637#include <stdio.h>#include <stdlib.h>#include <unistd.h& ...
UNIX环境编程-并发(11)
UNIX环境编程-并发(11)一、信号1.信号的概念 信号是软件层面的中断,信号的响应依赖于中断
(signal)是一种用于异步通知进程某个事件已经发生的机制。当进程收到一个信号时,它可以有几种不同的反应,包括忽略该信号、执行默认的信号处理动作,或者调用一个用户定义的处理函数
(1)同步与异步同步
在同步操作中,一个任务必须等待前一个任务完成后才能继续执行。这意味着您在等待任务完成时不能做任何其他事情
特点
执行顺序是可预测的。
容易编写和理解,因为操作按预期的顺序执行。
可能会浪费CPU时间,因为它在等待外部资源(如磁盘IO、网络请求等)时可能会处于闲置状态
异步在异步操作中,你可以在等待某个任务完成时继续执行其他任务。当那个任务完成后,系统通常会使用回调、事件或其他机制来通知你
特点
执行顺序不是固定的,可能需要额外的工具或方法(如回调、promises、futures等)来处理。
可以更充分地利用CPU,因为它可以在等待外部资源时执行其他任务。
可能会更难编写和理解,特别是当涉及到大量的异步操作和回调时
2.signal()在ubuntu 终端中输入kill ...
多线程与线程同步
多线程与线程同步视频教程:爱编程的大丙
视频文档地址:爱编程的大丙
1.线程与进程区别
进程由独立的地址空间,多个线程共用同一个地址空间
在一个地址空间中多个线程独享:每个线程都有自己的栈区。寄存器
在一个地址空间中多个线程共享:代码段、堆区、全局数据区,打开的文件都是线程共享的
线程是程序执行的最小单位,进程是操作系统中最小的资源分配单位
每个进程对应一个虚拟地址空间,一个进程只能抢一个CPU时间片
一个地址空间中可以划分出多个线程,在有效的资源基础上,可以抢更多的CPU时间片
CPU的调度与切换:线程的上下文切换比进程快
上下文切换: 进程\线程分时复用CPU时间片,在切换之前会将上一个任务的状态进行保存(状态存储在寄存器),下次切换回这个任务的时候(此时再次获得CPU资源-时间片),加载这个状态继续运行,任务从保存到再次加载这个过程就是一次上下文切换
线程更为廉价,启动/退出速度更快,对系统资源冲击小
2.创建线程2.1.线程函数每一个线程都有一个唯一的线程ID,ID类型为pthread_t,这个ID是一个无符号长整型数,通过以下函数获取当前线程 ...
线程池C语言版本
线程池C语言版本教程文档:爱编程的大丙
视频教程:爱编程的大丙
一、线程池原理线程池使得线程可以得到复用,在执行完一个任务之后,不进行销毁而是继续执行其他任务。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
线程池的组成主要分为3个部分,这三部分配合工作就可以得到一个完整的线程池:
任务队列中的任务实际是回调函数,函数地址
1.任务队列,存储需要处理的任务,由工作的线程来处理这些任务
通过线程池提供的API函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除
已处理的任务会被从任务队列中删除
线程池的使用者,也就是调用线程池函数往任务队列中添加任 ...
矩阵导数-drcan
矩阵导数