进程间通讯方式哪种访问速度最快
一。
管道(pipe) 管道是Linux支持的最初IPC方式,管道可分为无名管道,有名管道等。
(一)无名管道,它具有几个特点: 1) 管道是半双工的,只能支持数据的单向流动;两进程间需要通信时需要建立起两个管道; 2) 无名管道使用pipe()函数创...
fifo规则
1.从FIFO中读取数据:
约定:如果一个进程为了从FIFO中读取数据而阻塞打开了FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作。
(1)如果有进程写打开FIFO,且当前FIFO为空,则对于设置了阻塞标志的读操作来说,将一直阻塞下去,直到有数据可以读时才继续执行;对于没有设置阻塞标志的读操作来说,则返回0个字节,当前errno值为EAGAIN,提醒以后再试。
(2)对于设置了阻塞标志的读操作来说,造成阻塞的原因有两种:一、当前FIFO内有数据,但有其它进程在读这些数据;二、FIFO本身为空。
解阻塞的原因是:FIFO中有新的数据写入,不论写入数据量的大小,也不论读操作请求多少数据量,只要有数据写入即可。
(3)读打开的阻塞标志只对本进程第一个读操作施加作用,如果本进程中有多个读操作序列,则在第一个读操作被唤醒并完成读操作后,其它将要执行的读操作将不再阻塞,即使在执行读操作时,FIFO中没有数据也一样(此时,读操作返回0)。
(4)如果没有进程写打开FIFO,则设置了阻塞标志的读操作会阻塞。
(5)如果FIFO中有数据,则设置了阻塞标志的读操作不会因为FIFO中的字节数少于请求的字节数而阻塞,此时,读操作会返回FIFO中现有的数据量。
2.从FIFO中写入数据:
约定:如果一个进程为了向FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。
FIFO的长度是需要考虑的一个很重要因素。系统对任一时刻在一个FIFO中可以存在的数据长度是有限制的。它由#define PIPE_BUF定义,在头文件limits.h中。在Linux和许多其他类UNIX系统中,它的值通常是4096字节,Red Hat Fedora9下是4096,但在某些系统中它可能会小到512字节。
虽然对于只有一个FIFO写进程和一个FIFO的读进程而言,这个限制并不重要,但只使用一个FIFO并允许多个不同进程向一个FIFO读进程发送请求的情况是很常见的。如果几个不同的程序尝试同时向FIFO写数据,能否保证来自不同程序的数据块不相互交错就非常关键了à也就是说,每个写操作必须“原子化”。
c语言signal函数的应用
C语言中的signal函数用于设置信号处理函数,其语法如下:
```c
void (*signal(int sig, void (*func)(int)))(int);
```
其中,sig表示要设置的信号,func是信号处理函数。
signal函数的应用包括:
1. 捕捉信号:使用signal函数可以捕捉特定的信号,如SIGINT(中断信号)和SIGTERM(终止信号),并在捕捉到信号时执行相应的处理函数。
2. 防止子进程变成僵尸进程:在父进程中使用signal函数将SIGCHLD信号设置为忽略,可以防止子进程变成僵尸进程。
3. 定时器:使用signal函数结合setitimer函数可以实现定时器功能,即在指定的时间间隔内执行指定的操作。
4. 多线程同步:在多线程程序中,使用signal函数可以向指定线程发送信号,实现线程之间的同步和通信。
需要注意的是,不同的操作系统可能支持的信号种类和处理方式不同,需要根据实际情况进行选择和使用。