这三个函数的区别在于它们如何访问文件,特别是在涉及符号链接(symlinks)时的行为。 stat 函数用于获取指定路径(path)所指向文件或目录的状态信息。...因此,缓冲区的作用是让数据的读写更高效,减少直接访问外部设备的次数。...缓冲区的分类 缓冲区可以按作用场景分为多种类型: 缓冲区类型 作用 用户态(应用层)缓冲区 C 标准库 stdio 缓冲区(如 stdout、stdin),减少 write() 调用,提高性能 内核态缓冲区...(1)Page Cache 的作用 加速磁盘读写,避免频繁访问硬盘。 合并小的写入请求,减少 I/O 操作次数。 (2)如何强制数据写入磁盘?...fflush(stdout); vs. fsync(fd); 函数 作用 刷新的范围 fflush(stdout); 刷新 C 语言 stdio 缓冲区 从 stdout 到 write(fd, buf
1、如何理解在Linux中一切皆文件?...它将一个进程的输出作为另一个进程的输入,实现了进程间的数据传递。 1.3 优势 统一接口:“一切皆文件”使得Linux系统提供了一个统一的接口来访问和管理所有资源。...用户级缓冲区的作用是减少系统调用次数,内核级缓冲区的作用是减少IO次数。 2.2 缓冲类型 标准I/O提供了3种类型的缓冲区。 全缓冲区:这种缓冲方式要求填满整个缓冲区后才进行IO系统调用操作。...文件存在就要被访问,访问文件的前提是要打开文件,打开文件的前提是先要找到这个文件,那么对于未打开的文件我们如何找到它,就是文件管理系统需要做的工作。...如何理解文件的路径? 扇区是磁盘存储数据的基本单位,通常是512KB,所以磁盘也叫块设备。
:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程) 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常...公式:shmaddr - (shmaddr % SHMLBA) shmflg=SHM_RDONLY,表示连接操作用来只读共享内存 3.3.3 shmdt函数 功能:将共享内存段与当前进程脱离 原型...被保护起来的资源 --- 临界资源 ---- 同步和互斥:- 用互斥的方式保护共享资源 ---临界资源 互斥:任何时刻只能有一个进程在访问共享资源 资源 --- 要被程序员访问 --- 资源被访问,朴素的认识...,就是通过代码访问 --- 代码访问共享资源的代码 +不访问共享资源的代码e.所谓的对共享资源进行保护 --- 临界资源 --- 本质是对访问共享资源的代码进行保护!...在进程中涉及到互斥资源的程序段叫临界区 特性方面 IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核 7.OS管理 操作系统如何把共享内存,消息队列,信号量统一管理起来
/*子进程*/ else { /*关闭管道的读描述符*/ close(fd[0]); /*向管道写入数据*/ write...消息队列与后面介绍的UNIX域套接字相比,在速度上没有多少优势。 信号量 信号量是一个计数器,它主要用在多个进程需要对共享数据进行访问的时候。...但是需要另外提供手段来保证共享内存的同步访问,例如它可以用到前面所提到的信号量来实现访问同步。...UNIX域套接字 UNIX域套接字和套接字很相似,但是它有更高的效率,因为它不需要执行协议处理,例如计算校验和,发送确认报文等等,它仅仅复制数据。 当然,它也只适用于同一台计算机上的进程间通信。...而信号量实际上常用于共享数据的同步访问。共享内存在进程间传递数据非常高效,但是系统没有对访问进行同步,因此还需要另外实现数据的访问同步。套接字(socket)是应该目前应用最广泛的进程间通信方式。
1.一个线程可以调用pthread_cancel来取消另一个线程。 2.被取消的线程需要被join来释放资源。...int inheritsched; //线程的继承性 int scope; //线程的作用域...pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr); 线程属性主要包括如下属性: 作用域...对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。...一般条件变量有两个状态: 一个/多个线程为等待“条件变量的条件成立“而挂起; 另一个线程在“条件变量条件成立时”通知其他线程。
一个进程写入管道的数据可以被另一个进程读取。数据按先进先出顺序处理。Linux有两种形式的管道文件,管道和FIFO。...管道或FIFO都可以使用read/write函数访问,且读写操作都是按顺序发生的,从文件的开头读取并在末尾写入(先进先出机制)。管道或 FIFO 必须同时在读写的两端打开。...对管道或FIFO,由于是半双工模式,write()函数总是往末尾添加数据,read()函数则总是从开头读出数据。如果对管道或FIFO调用lseek(), 会返回ESPIPE错误。...) --成功运行后,向子进程返回0,并向父进程返回子进程的进程ID Demo1: 父进程关闭管道的读端,只往写端写入数据;子进程关闭管道的写端,只从读端读出数据 #include <sys/types.h...the FIFO\n", in); close(wfd); } close(rfd); } unlink(fn); } } *为了保证进程访问管道和
= write(wfd,&pid,sizeof(pid_t))) //将自己的pid写到wfifo中 { printf("write error on : %s\n",wfifo);...return res; } printf("B:my pid is %d, other process pid is %d\n",pid,opid); //打印出自己的pid和从管道中获取的另一个进程的...= write(wfd,&pid,sizeof(pid_t))) //将自己的pid写到wfifo中去 { printf("write error on : %s\n",wfifo);..., the signal is 40 B:sent 9 signal to 19428 emacs@ubuntu:~/c$ 编译执行过程中没有报错,从结果来看,符合预期 ---- unlink 在 unistd.h.../* Remove the link NAME. */ extern int unlink (__const char *__name) __THROW __nonnull ((1)); 它所起的作用就是删除文件
任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信...什么是管道 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe()系统函数就可以创建一个管道。管道具有下面的特点: 管道的本质是一个伪文件,实际上就是内核缓冲区。...下面通过图示来说明进程间是如何通过管道通信的。 ① 父进程调用pipe()函数创建管道,并得到指向管道读端和写端的文件描述符fd[0]和fd[1]。...由于管道是利用环形队列实现的,数据从写端流入管道,从读端流出,这样就实现了进程间通信。...(可以把FIFO理解为一个文件,一个进程向该文件写数据,另一个进程从该文件中读书数据,前提是两个进程读写的是同一个FIFO文件才能实现通信) 2.
通过进程间通信,可以实现多个进程对同一资源的访问和操作,提高资源的利用率和效率。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件,如进程终止、资源可用等。...这使得对管道的访问速度非常快,类似于对内存的直接访问 匿名管道是通过创建子进程,而子进程会继承父进程的相关属性信息,来实现不同的进程看到同一份资源 通过管道,一个进程(写端)可以将数据发送给另一个进程...这样,一个进程就可以通过pipefd[1]向管道写入数据,而另一个进程则可以通过pipefd[0]从管道中读取数据。这种机制使得两个进程之间可以通过管道进行通信。...一个进程往管道中写入数据,另一个进程从管道中读取数据。命名管道是阻塞的,如果写入进程写入数据时,没有进程读取数据,写入进程会被阻塞直到有进程读取数据。...它的作用是在文件系统中创建一个特殊类型的文件,这个文件可以被多个进程用来进行进程间通信。
/*子进程*/ else { /*关闭管道的读描述符*/ close(fd[0]); /*向管道写入数据*/ write...return -1; } /*关闭管道的读描述符*/ writeFd = open(FIFO,O_WRONLY,0); /*向管道写入数据*/ write...消息队列与后面介绍的UNIX域套接字相比,在速度上没有多少优势。 信号量 信号量是一个计数器,它主要用在多个进程需要对共享数据进行访问的时候。...但是需要另外提供手段来保证共享内存的同步访问,例如它可以用到前面所提到的信号量来实现访问同步。...UNIX域套接字 UNIX域套接字和套接字很相似,但是它有更高的效率,因为它不需要执行协议处理,例如计算校验和,发送确认报文等等,它仅仅复制数据。 当然,它也只适用于同一台计算机上的进程间通信。
loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程...UNIX域套接字与TCP套接字相比较,在同一台主机的传输速度前者是后者的两倍。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。...***************************************************/ #include #include #includeunistd.h...三、UNIX域套接字编程注意点 1、bind成功将会创建一个文件,权限为0777 & ~umask 2、sun_path最好用一个绝对路径 3、UNIX域协议支持流式套接口与报式套接口 4、UNIX...域流式套接字connect发现监听队列满时,会立刻返回一个ECONNREFUSED,这和TCP不同,如果监听队列满,会忽略到来的SYN,这导致对方重传SYN。
行了,还是来段代码吧 主要就是三部曲,看我标注出来 #include #include unistd.h> #include int main() {...> #include #include //从管道文件里面读取内容,并将内容写入另一个文件中 int main() { int infd...prot 参数指定共享内存的访问权限。可取如下几个值的或: PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。...fd为即将映射到进程空间的文件描述字,一般由open()返回 offset参数一般设为0,表示从文件头开始映射。...当映射关系解除后,对原来映射地址的访问将导致段错误发生。
这就引出了一个关键问题:如何高效、安全地实现进程间的数据交换与通信?这就是进程间通信(Inter-Process Communication,IPC)的核心问题。...本指南旨在深入探讨进程间通信的各种机制,从基础知识到实战应用,帮助读者全面理解IPC的工作原理,并掌握如何在不同场景下选择和应用最合适的IPC方法。...; write(pipefd[1], message, strlen(message));读操作:另一个进程可以通过读取文件描述符从管道中读取数据。读取操作会从缓冲区中提取数据,并将其返回给调用进程。...在Shell脚本中,管道被广泛用于将一个命令的输出传递给另一个命令作为输入。...本地套接字(Local Socket,也称为 Unix 域套接字)和网络套接字(Network Socket)是两种不同的套接字类型,它们主要在使用场景、实现方式和特性上有所区别。
; (2) 文件偏移量简介 文件偏移量 : -- 当前文件偏移量 : 每个打开的文件都有一个当前文件偏移量, 非负整数, 从开始处计算的字节数; 读写操作都是从当前文件偏移处开始, 读写会使当前文件偏移量增加...> ssize_t read(int fildes, void *buf, size_t nbyte); -- 作用 : 从 fildes 代表的文件中, 读取 nbyte... -- 函数内容 : #include unistd.h> ssize_t write(int fildes, const void *buf, size_t nbyte...); -- 函数作用 : 将 buf 字符串的前 nbyte 个字节数据写入 files 文件标示符 代表的文件中; -- 返回值 : 若成功, 返回已写的字节数, 如果失败返回 -1; 3. write...", O_RDONLY)) == -1) err_sys("打开文件出错"); //从文件中读取文件内容 if( (read_size = read(fd, buf_read, strlen(
下面说明了两个进程同时读一个文件的同一页的情形,系统要将该页从磁盘读到高速缓冲区中,每个进程再执行一个内存期内的复制操作将数据从高速缓冲区读到自己的地址空间。...普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write 等操作。..., off_t off) int msync(void *addr, size_t len, int flags); int munmap(void *addr, size_t len); mmap的作用是映射文件描述符和指定文件的...prot:指定空想内存的访问权限。可取如下几个值的或:PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)、PROT_NONE(不可访问)。 ...进程能够访问的有效地址大小取决于文件被映射部分的大小。简单的说,能够容纳文件被映射部分大小的最少页面个数决定了进程从mmap()返回的地址开始,能够有效访问的地址空间大小。
这样可以通过访问该路径就能使得两个进程之间相互通信。此处的FIFO严格遵守“先进先出”原则。读总是从头开始的,写总是从尾部进行的。匿名管道和FIFO都不支持lseek函数对他们操作。...管道这个名字是非常形象的,一个管道必须有两端(就是在一个进程中必须读,另一个进程必须写),只有这样,才能正常操作,否则进程将会阻塞。例如下面这样。...FIFO"); } else { write(fd,"Hello",5); printf("Write...首先建立我们有两个进程,一个是test1,另一个是test2....调用 write() 函数向 FIFO 里写数据,当缓冲区已满时 write() 也会阻塞。 通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会退出。
如何实现进程间通信 2. 管道通信 2.1. 匿名管道 2.1.1 创建匿名管道 2.1.2 . 深入理解匿名管道 2.2. 命名管道 2.2.1....数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某种事件。...如何实现进程间通信 由于一个进程是不能访问到另一个进程的资源的,即进程之前是具有独立性的。 那么进程之间要通信,就不能使用属于进程的资源,而应该使用一份公共的资源。...fflush(stdout); char buffer[64] = {0}; ssize_t s = read(0, buffer, sizeof(buffer)-1); // 从显示器上读取数据...临界资源:同时被多个进程访问的资源。例如:显示器打印,共享内存,消息队列 临界区:用来访问临界资源的代码,就是临界区。
内核提供一条通道不成问题,问题是如何标识这条通道才能使各进程都可以访问它?文件系统中的路径名是全局的,各进程都可以访问,因此可以用文件系统中的路径名来标识一个IPC通道。...各进程可以打开这个文件进行read/write,实际上是在读写内核通道(根本原因在于这个file结构体所指向的read、write函数和常规文件不一样),这样就实现了进程间通信。...命名管道可以从命令行上创建,命令行方法是使用下面这个命令: $ mkfifo filename 命名管道也可以从程序里创建,相关函数有: int mkfifo(const char *filename...,可以先运行RD程序,此时会阻塞,再在另一个窗口运行WR程序,此时两个程序都会从open返回成功。...**********************************************/ #include #include #includeunistd.h
这意味着,当一个进程向这块内存写入数据时,其他进程可以立即看到这些更改,因为它们实际上是在访问 相同的内存位置 。...PROT_WRITE:页可以被写入。 PROT_NONE:页不可访问。 flags:指定映射对象的类型、映射选项和映射页是否可以共享。 fd:有效的文件描述词。...\0", 13); //sprintf(ptr,"%s","Hello"); 【2】利用mmap()函数从共享内存访问&读取数据 使用 mmap() 函数将共享内存映射到进程的地址空间,然后通过指针操作来读取访问数据...shm_unlink("/my_shared_memory"); // 删除命名的共享内存对象 二.实现效果展示&要求 编写程序 producer.c,且不考虑程序的退出;实现每隔1秒向共享内存对象中写一个数字(从1...即两个伪终端producer和consumer,一个不断产生1-1000,另一个模拟取出1-1000 此时我们查看/dev/shm文件中的内容,hd my_shared_memory 三.使用两个伪终端模拟实现
在 Linux 中,用户程序不能直接访问内核提供的服务,必须通过系统调用来使用内核提供的服务。...,Linux为程序中每个打开的文件分配一个文件描述符 文件描述符从0开始分配,依次递增 文件IO操作通过文件描述符完成 注意:每个程序中打开的文件系统会单独分配文件描述符,互相不影响 文件I/O与标准I...buf是接收数据的缓冲区 示例 从指定的文件(文本文件)中读取内容并统计大小 #include #include unistd.h> int main(int argc...) write函数用来向文件写入数据: #include unistd.h> ssize_t write(int fd,void *buf,size_t count);//buf写入内容...buf); 成功时返回0;出错时返回EOF; 如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性 struct stat是存放文件属性的结构体类型: 结构体类型 作用
领取专属 10元无门槛券
手把手带您无忧上云