linuxC-进程间通信-有名管道fifo
- 格式:pdf
- 大小:632.06 KB
- 文档页数:7
c语言有名管道fifo管道的用法【C语言有名管道(FIFO管道)的用法】中括号为主题的文章【引言】C语言是一种广泛应用于系统软件开发的编程语言,拥有丰富的库函数和系统调用接口。
在C语言中,有名管道(也称为FIFO管道)是一种特殊的文件类型,用于实现不同进程之间的通信。
本文将一步一步详细介绍C语言有名管道(FIFO 管道)的用法,以帮助读者更好地理解和使用该功能。
【目录】一、什么是有名管道二、有名管道的创建三、有名管道的打开和关闭四、有名管道的读写操作五、有名管道的进程间通信六、有名管道的应用示例七、有名管道的优缺点八、总结【一、什么是有名管道】有名管道是一种特殊的文件类型,在文件系统中以文件的形式存在。
它是C语言用于进程间通信的一种方式,可以实现不同进程之间的数据传输。
有名管道是一种半双工的通信机制,允许一个进程写入数据到管道,同时另一个进程从管道中读取数据。
有名管道适用于在不相关的进程之间进行通信,特别是父子进程之间。
【二、有名管道的创建】要创建一个有名管道,首先需要使用C语言库函数mkfifo来创建一个文件节点(相当于管道的入口)。
mkfifo函数的原型如下:int mkfifo(const char *pathname, mode_t mode);其中,pathname代表要创建的有名管道的文件路径,mode用于设置管道的权限。
例如,以下代码会创建一个名为myfifo的有名管道:#include <sys/types.h>#include <sys/stat.h>int main() {mkfifo("myfifo", 0666);return 0;}运行该程序后,系统中将会被创建一个名为myfifo的有名管道。
【三、有名管道的打开和关闭】打开一个有名管道以进行读取和写入操作,可以使用C语言库函数open。
open 函数的原型如下:int open(const char *pathname, int flags);其中,pathname代表要打开的有名管道的文件路径,flags用于指定打开管道的方式(只读、只写、读写)。
网络与信息安全管理员(4级)试题一、单选题(共60题,每题1分,共60分)1、在Linux系统中,()通常称为FIFO。
A、无名管道B、有名管道C、文件管道D、命名管道正确答案:D2、WireShark软件安装时可选安装的WinPcap软件的作用是()。
A、提供包过滤能力B、提供GUI界面C、提供底层的抓包能力D、增强抓包结果的分析能力正确答案:C3、()是传输层以上实现两个异构系统互连的设备。
A、路由器B、网桥C、网关D、集线器正确答案:A4、()是指攻击者在非授权的情况下,对用户的信息进行修改,如修改电子交易的金额。
A、非法使用攻击B、拒绝服务攻击C、信息泄漏攻击D、完整性破坏攻击正确答案:D5、网络犯罪的人一般具有较高的专业水平体现了互联网信息内容安全犯罪()的特点。
A、犯罪手段提升B、犯罪后果严重化C、犯罪主体专业化D、犯罪手段隐蔽化正确答案:C6、下列关于Botnet说法错误的是()。
A、用Botnet发动DDoS攻击B、Botnet的显著特征是大量主机在用户不知情的情况下,被植入了C、拒绝服务攻击与Botnet网络结合后攻击能力大大削弱D、Botnet可以被用来传播垃圾邮件、窃取用户数据、监听网络和扩正确答案:C7、来自网络的拒绝服务攻击可以分为停止服务和消耗资源两类。
攻击特点不包括以下哪个()。
A、多源性、特征多变性B、攻击目标与攻击手段多样性C、开放性D、隐蔽性正确答案:C8、计算机病毒的特性包括()。
A、传播性、破坏性、寄生性B、传染性、破坏性、可植入性C、破坏性、隐蔽性、潜伏性D、自我复制性、隐蔽性、潜伏正确答案:C9、TCSEC标准将计算机系统分为()个等级、7个级别。
A、4B、5C、6D、7正确答案:A10、上网收集与被害人、被害单位有关的负面信息,并主动联系被害人、被害单位,以帮助删帖、“沉底”为由,向其索取财物的行为,构成()。
A、诈骗罪B、诽谤罪C、侮辱罪D、敲诈勒索罪正确答案:D11、TCP/IP参考模型的四个层次分别为()、网际层、传输层、应用层。
2011-06-08 21:45linux 管道 FIFO——写的很全,转来的pipe是Linux中最经典的进程间通信手段,在终端里通常用来组合命令,例如“ls -l|wc -l”。
它的作用很直观,就是使得前一个进程的输出作为后一个进程的输入,在概念上很符合“管道”的意思。
用管道实现“ls -l | wc -l”《情景分析》上有这个例子的代码,我觉得很适合用来了解管道。
这里假设终端对应的进程为PA,wc、ls是PA先后创建的两个子进程child_B与child_C。
代码简化后抄录如下:int main(){int pipefds[2], child_B, child_C;pipe(pipefds);if (!(child_B=fork()){ //先创建“读”的一端,它要关闭“写”的的一端close(pipefds[1]);close(0);dup2(pipefds[0], 0); //在执行系统调用execve后,child_B会释放0,1,2之外由父进程打开的文件,close(pipefds[0]); //所以要把pipefds[0]复制到标准输入对应的文件句柄0 execl("/usr/bin/wc", "-l", NULL);} //这里之后,A和B可以通过管道进行通信close(pipefds[0]);if (!(child_C=fork()){ //再创建“写”的一端,它要关闭“读”的的一端close(1);dup2(pipefds[1],1); //道理同前面close(pipefds[1]);execl("/bin/ls", "-1", NULL);} //这里之后,B和C可以通过管道进行通信close(pipefds[1]);wait4(child_B, NULL, 0, NULL);return 0;}FIFOFIFO就是命名管道,或有名管道。
linux管道fifo监听用法Linux管道(FIFO)监听用法Linux管道(FIFO)是一种特殊类型的文件,用于进程间通信。
它允许两个或多个进程在同时进行读写操作,实现数据传输和共享。
管道本身是一种单向的通道,数据只能在一个方向上流动。
本文将详细介绍Linux管道的监听用法,以帮助读者理解其工作原理和使用方法。
1. 创建FIFO管道:要使用管道进行通信,首先需要创建一个FIFO管道文件。
在Linux中,可以使用mkfifo命令创建一个FIFO文件,其语法格式如下:shellmkfifo [管道文件名]例如,要创建一个名为myfifo的管道文件,可以运行以下命令:shellmkfifo myfifo2. 打开FIFO管道:创建了FIFO管道文件后,进程需要打开该管道以进行数据的读写操作。
在Linux中,可以使用open系统调用在C语言程序中打开一个管道文件。
以下是open函数的原型:c#include <fcntl.h>int open(const char *pathname, int flags);其中,`pathname`是要打开的管道文件名,`flags`是打开文件的标志。
常见的标志有O_RDONLY(只读模式打开管道)、O_WRONLY(只写模式打开管道)和O_RDWR(读写模式打开管道)。
例如,在C语言程序中,要以只读模式打开myfifo管道文件,可以使用以下代码:cint fd = open("myfifo", O_RDONLY);3. 监听FIFO管道:打开管道后,进程就可以监听管道,等待其他进程向其写入数据。
在Linux 中,可以使用read函数从管道中读取数据。
以下是read函数的原型:c#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);其中,`fd`是打开的管道文件的文件描述符,`buf`是接收数据的缓冲区,`count`是要读取的字节数。
Linux⽂件系统--简述⼏种⽂件类型 Linux 中⼀切皆为⽂件,⽂件类型也有多种,使⽤ ls -l 命令可以查看⽂件的属性,所显⽰结果的第⼀列的第⼀个字符⽤来表明该⽂件的⽂件类型,如下:1、普通⽂件 使⽤ ls -l 命令后,第⼀列第⼀个字符为 "-" 的⽂件为普通⽂件,如上图所⽰,普通⽂件⼀般为灰⾊字体,绿⾊字体的是可执⾏⽂件,红⾊字体的是压缩⽂件。
⽂件的权限: 以普通⽂件为例,使⽤ ls -l 命令,可以看到结果的第⼀列是 -rwxrwxrwx 的形式,其中第⼀个字符 "-" 表⽰这个⽂件为普通⽂件,它也可以是其他的字符,不同的字符代表不同类型的⽂件。
其后的⼀串字符表明了该⽂件的权限,其中:1)r 表明该⽂件具有可读权限,若该位置为 "-" ,则表明⽂件不可读;2)w 表明该⽂件具有写权限,若该位置为 "-" ,则表明⽂件不可写;3)x 表明该⽂件具有可执⾏权限,若该位置为 "-" ,则表明⽂件不具有可执⾏权限;4)第⼀个 rwx 表⽰该⽂件的所有者对该⽂件的权限;第⼆个 rwx 表⽰该⽂件所属组对该⽂件的权限;第三个 rwx 表⽰其他⽤户对该⽂件的权限。
创建⼀个普通⽂件: 可以使⽤ touch 命令来创建⼀个⽂件:touch newfile删除⼀个普通⽂件: 可以使⽤ rm 命令来删除⼀个⽂件:rm newfile2、⽬录⽂件 Linux 中的⽬录也是⽂件,⽬录⽂件中保存着该⽬录下其他⽂件的 inode 号和⽂件名等信息,⽬录⽂件中的每个数据项都是指向某个⽂件 inode 号的链接,删除⽂件名就等于删除与之对应的链接。
⽬录⽂件的字体颜⾊是蓝⾊,使⽤ ls -l 命令查看,第⼀个字符为"d"(directory)。
⽬录⽂件的权限:1)r 表明该⽬录⽂件具有可读权限,即可以使⽤ ls 命令查看该⽬录的存储情况;2)w 表明该⽬录⽂件具有写权限,即可以往该⽬录下添加、修改、删除⽂件;3)x 表明该⽬录⽂件具有可执⾏⽂件,即可以使⽤ cd 命令进⼊到该⽬录下。
关于C语⾔进程操作关于C语⾔进程操作Linux标准库 <unistd.h>符号常量NULL // Null pointerSEEK_CUR // Set file offset to current plus offset.SEEK_END // Set file offset to EOF plus offset.SEEK_SET // Set file offset to offset.是POSIX标准定义的unix类系统定义符号常量的头⽂件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数。
unistd.h在unix中类似于window中的windows.h。
#ifdef WIN32#include <windows.h>#else#include <unistd.h>#endif函数原型ssize_t read(int, void *, size_t);int unlink(const char *);ssize_t write(int, const void *, size_t);int usleep(useconds_t);unsigned sleep(unsigned);int access(const char *, int);unsigned alarm(unsigned);int chdir(const char *);int chown(const char *, uid_t, gid_t);int close(int);size_t confstr(int, char *, size_t);void _exit(int);pid_t fork(void);关于管道pipe管道的概念管道是⼀种最基本的IPC机制,作⽤于有⾎缘关系的进程之间,完成数据传递。
调⽤pipe系统函数即可创建⼀个管道。
有如下特质:其本质是⼀个伪⽂件(实为内核缓冲区)由两个⽂件描述符引⽤,⼀个表⽰读端,⼀个表⽰写端。
进程间通信—有名管道
◦fifo简介
无名管道,它只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。
有名管道的出现突破了这种限制,它可以使互不相关的两个进程实现彼此通信。
该管道可以通过路径名来指出,并且在文件系统中是可见的。
在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。
FIFO 是严格地遵循先进先出规则的,对管道及 FIFO 的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
有名管道的创建可以使用函数 mkfifo(),该函数类似文件中的 open()操作,可以指定管道的路径和打开的模式。
进程通过文件IO来操作有名管道,有名管道创建之后,任何进程都可以访问。
◦fifo打开方式
在创建管道成功之后,就可以使用open()、read()和write()这些函数了。
与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置
O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY。
1.如果打开的时候是,是以只读方式(O_RDONLY)打开的,则open返回
的文件描述符fd是只读的。
2.如果打开的时候是,是以只写方式(O_WRONLY)打开的,则open返回的
文件描述符fd是只写的
3.如果打开的时候是,是以读写方式(O_RDWR)打开的,则open返回的文
件描述符fd是读写的
◦fifo读写特性
由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以
在open()函数中设定为O_NONBLOCK。
下面分别对阻塞打开和非阻塞打开的读写进行讨论。
(1)对于读进程。
•若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
•若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。
即如果FIFO内没有数据,则读函数将立刻返回0。
(2)对于写进程。
•若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
•若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
◦fifo创建函数
mkfifo()函数格式
表8.4列出了mkfifo()函数的语法要点。
函数语法要点
表8.4mkfifo()
FIFO
相关的出错信息
◦fifo创建终端命令
用户还可以在命令行使用“mknod 管道名 p”来创建有名管道。
还可以运用mkfifo 有名管道名 创建文件
命令mkfifo和有名管道函数创建一样。
◦典型的fifo模型
C/S模型
◦fifo示例
第一个文件create_fifo.c主要是创建一个管道文件,也可以用mkfifo命令来创建一个管道。
管道创建好之后可以在文件系统中看到,同时也可以看到文件的大小为0。
create_fifo.c
创建好之后的运行效果。
下面的程序要运用到否创建的这个管道文件。
read_fifo.c这是读取管道,从管道中读取文件。
write_fifo.c
程序的运行的结果如下:。