linuxC-进程间通信-有名管道fifo

合集下载

c语言有名管道fifo管道的用法

c语言有名管道fifo管道的用法

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级)试题

网络与信息安全管理员(4级)试题

网络与信息安全管理员(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就是命名管道,或有名管道。

L-IPC

L-IPC

25


有名管道的创建可以使用函数 mkfifo(),该函 数类似文件中的open()操作,可以指定管道的路 径和打开的模式。 在创建管道成功之后,就可以使用open、read、 write这些函数了。与普通文件的开发设置一样, 对于为读而打开的管道可在open中设置 O_RDONLY,对于为写而打开的管道可在open中设 置 O_WRONLY,在这里与普通文件不同的是阻塞 问题。由于普通文件的读写时不会出现阻塞问题, 而在管道的读写中却有阻塞的可能,这里的非阻 塞标志可以在open函数中设定为 O_NONBLOCK。
26


对于读进程 若该管道是阻塞打开,且当前 FIFO 内没有数 据,则对读进程而言将一直阻塞直到有数据写 入。 若该管道是非阻塞打开,则不论 FIFO 内是否 有数据,读进程都会立即执行读操作。 对于写进程 若该管道是阻塞打开,则写进程而言将一直阻 塞直到有读进程读出数据。 若该管道是非阻塞打开,则当前 FIFO 内没有 读操作,写进程都会立即执行读操作。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 在Alpha AXP Linux系统上,信号的编号有些不同。

Linux操作系统分析课件13

Linux操作系统分析课件13


任意的两个进程不可en@2007.10.25
Linux Operating Systems analysis
7
FIFO


管道的一个重大限制是它没有名字,因此 只能用于具有亲缘关系的进程间通信,在 有名管道(named pipe或FIFO)提出后, 该限制得到了克服。 FIFO,有名管道
Linux Operating Systems analysis
15

发送消息
int msgsnd(int msqid, //目标消息队列 struct msgbuf *msgp, //待发送的消息 int msgsz, //消息的大小 int msgflg); //标志 对于发送消息来讲,msgflg有意义的标志为 IPC_NOWAIT:指明在消息队列没有足够空间容纳 要发送的消息时,msgsnd是否等待


命令1:“ls > tmp” 命令2:”more < tmp” 命令1把ls的输出重定向到tmp文件中; 命令2把more的输入重定向到tmp文件
Linux Operating Systems analysis 5
xlanchen@2007.10.25
创建一个管道


管道可看成是被打开的文件,但并没有真实的 文件与之对应 pipe()系统调用用来创建一个新的管道
Linux操作系统分析
进程间同步和通信
进程间通信

IPC,Inter-Process Communication Unix系统提供的基本的IPC包括:
1、管道和FIFO(有名管道) 2、消息 3、信号量 4、共享内存区 5、套接字
xlanchen@2007.10.25

实验六 进程间通信

实验六 进程间通信

3.2 实验内容(2)

进程的管道通信
编写程序,实现进程的管道通信:父进程使用系统调用pipe() 建立一个管道。创建两个子进程p1和p2,分别向管道个发一 条信息后结束: Child 1 is sending a message to parent. Child 2 is sending a message to parent. 父进程从管道中分别接收两个子进程发来的消息并显示在屏 幕上,然后父进程结束。要求父进程先接受子进程p1发来的 消息,然后再接收子进程p2发来的消息。
实验六 进程间通信

预备知识
Linux进程间通信 进程软中断通信
管道和消息队列

实验指导
软中断通信函数
管道通信的使用
消息队列的应用

实验目的、内容
2.1 软中断通信函数(1)

向一个进程或一组进程发送一个信号: int kill(pid, sig)
pid>0时,核心将信号发送给进程pid
理程序
2.1 软中断通信函数(2)

pid_t wait(int * status)
暂时停止目前进程的执行,直到有信号来或子进程结束

pid_t waitpid(pid_t pid, int * status, int options)
pid的取值 pid=-1时,等待任何一个子进程退出,相当于wait() pid=0时,等待进程组ID与目前进程相同的任何子进程 pid<-1时,等待进程组ID为pid绝对值的任何子进程 options有两个常数参数,可使用或运算,不用时设为0 WNOHANG:即使没有任何子进程退出,它也会立即返回 WUNTRACED:子进程进入暂停执行状态并马上返回,但结束 状态不予以理会

linux管道fifo监听用法

linux管道fifo监听用法

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管道通信(C语言)

linux管道通信(C语言)
int pipe_fd[2];
char buf_r[200];
memset(buf_r,0,sizeof(buf_r));
if(pipe(pipe_fd)<0;
return -1;
}
result=fork();
if(result<0){
printf("创建子进程失败");
Linux系统提供了丰富的进程通信手段,如信号、信号灯、管道、共享内存、消息队列等,能有效地完成多个进程间的信息共享和数据交换。管道作为最早的进程间通信机制之一,可以在进程之间提供简单的数据交换和通信功能。
2 管道技术简介
2.1 管道的概念及特点
管道分为无名管道和有名管道两种。无名管道可用于具有亲缘关系进程间的通信,如父子进程、兄弟进程。有名管道克服了管道没有名字的限制,允许无亲缘关系进程间的通信。本文应用的是无名管道通信机制。
exit(0);
}
else{
close(pipe_fd[0]);
if(write(pipe_fd[1],"**Hello world !**",17)!=-1)
printf("父进程向管道写入**Hello world !**\n");
if(write(pipe_fd[1]," **Welcome !**",15)!=-1)
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。
接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

进程间通信—有名管道
◦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
程序的运行的结果如下:。

相关文档
最新文档