linux进程间通信机制报告,linux 进程间通信机制(IPC机制)- 管道(示例代码)

本文介绍了管道通信中的无名管道和有名管道。无名管道主要用于具有亲缘关系的进程间单向通信,是临时性的。有名管道(FIFO)是一个实际存在的特殊文件,允许同主机任意进程间的数据交互。文中详细阐述了无名管道的创建与使用,以及有名管道的创建与读写操作,并通过示例代码进行演示。此外,还展示了在Shell中使用无名管道的例子。
摘要由CSDN通过智能技术生成

一,定义:

管道又可以分为无名管道和命名管道,两者的用途是不一样的。

无名管道PIPE:主要用于具有亲缘关系的进程之间的通信,无名管道的通信是单向的,只能由一段到另外一段;无名管道是临时性的,完成通信后将自动消失。一般采用先创建无名管道,再创建子进程,使子进程继承父进程的管道文件描述符,从而实现父子进程间的通信;在非亲缘关系管道之间,如果想利用无名管道进行通信,则需要借助另外的文件描述符传递机制。

有名管道FIFO:有名管道是一个实际存在的特殊文件,利用有名管道可以实现同主机任意进程之间的数据交互。

二,应用:

1,Shell中的无名管道

在Shell命令行中使用无名管道是到过管道符“ | ” 实现的。如ps -ax|grep mysql, 将ps -ax的内容通过管道传给grep mysql

2.创建无名管道

(1.)函数:

pipe(建立管道):

1) 头文件

#include

2) 原型:

int pipe(int filedes[2]);

3) 函数说明:

pipe()会建立管道,并将文件描述词由参数filedes数组返回。

filedes[0]为管道里的读取端

filedes[1]则为管道的写入端。

4) 返回值:

若成功则返回零,否则返回-1,错误原因存于errno中。

5)错误代码:

EMFILE 进程已用完文件描述词最大量

ENFILE 系统已无文件描述词可用。

EFAULT 参数 filedes 数组地址不合法。

(2)使用:

#include

#include

#include

int main()

{

int p[2];

int pid;

char *str = "HelloWorld";

char buf[128];

memset(buf,‘\0‘,128);

if(pipe(p) == -1)

{

printf("function pipe() calls failed.");

return -1;

}

if((pid=fork()) == -1) //创建一个子进程

{

printf("function fork() calls failed.\n");

return -1;

}

else if(pid == 0) //在子进程中

{

printf("In sub : pid=%d\n",getpid());

write(p[1],str,strlen(str)); //向无名管道中写入str

}else { //在父进程中

printf("In father : pid=%d\n",getpid());

read(p[0],buf,strlen(str)); //读取无名管道

printf("In father : buf=%s\n",buf);

}

}

结果:

20180110230637951588.png

注意:read和write为阻塞模式

3.创建有名管道

(1)函数:mkfifo(建立具名管道)

相关函数 pipe,popen,open,umask

1)表头文件

#include

#include

2)函数原型

int mkfifo(const char * pathname,mode_t mode);

3)函数说明

mkfifo()会依参数pathname建立特殊的FIFO文件,该文件必须不存在,而参数mode为该文件的权限(mode%~umask),因此umask值也会影响到FIFO文件的权限。

4)返回值 若成功则返回0,否则返回-1,错误原因存于errno中。

5)错误代码

EACCESS 参数pathname所指定的目录路径无可执行的权限

EEXIST 参数pathname所指定的文件已存在。

ENAMETOOLONG 参数pathname的路径名称太长。

ENOENT 参数pathname包含的目录不存在

ENOSPC 文件系统的剩余空间不足

ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。

EROFS 参数pathname指定的文件存在于只读文件系统内。

(2)使用:

#include

#include

#include

main()

{

char buffer[80];

int fd;

unlink(FIFO);

mkfifo(FIFO,0666);

if(fork()>0)

{

char s[ ] = “hello!\n”;

fd = open (FIFO,O_WRONLY);

write(fd,s,sizeof(s));

close(fd);

}

else

{

fd= open(FIFO,O_RDONLY);

read(fd,buffer,80);

printf(“%s”,buffer);

close(fd);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值