Linux 进程通信学习1-管道

本文介绍了Linux进程通信的目的,包括数据传输、资源共享、事件通知和进程控制,并详细阐述了无名管道和有名管道的概念、特点及使用方法。无名管道适用于父进程和子进程间通信,有名管道则允许任意两个进程通信。管道通信具有单向性,且数据读取后即消失,管道容量有限。创建和操作无名管道需在`fork()`之前,有名管道可通过`mkfifo()`创建并以文件形式进行读写操作。
摘要由CSDN通过智能技术生成

*进程通信的目的:

1、进程间数据传输

2、进程之间资源共享

3、进程通知事件,发送消息

4、进程的控制,一个进程完全控制另一个进程如debug进程。

*名词解释:

IPC(interprocess comunication) 进程间通信

POSIX 可移植的操作系统接口

*Linux进程间通信的7种主要方式:

无名管道pipe、有名管道FIFO,信号signal、消息队列、共享内存、、信号量、套接字socket

*管道通信

  一个进程在尾部写入数据另一个进程从管道头部读出数据。

  无名管道:只能用于父进程和子进程间的通信。

  有名管道: 运行于同一系统的任意两个进程间的通信。

  特点:

    管道通信是单向的,有固定的读端口和写端。

    数据被进程读出后,管道中的数据就不存在了

    进程读取空管道的时候,进程会阻塞。

    当进程像满管道写入数据的时,进程会阻塞。

    管道的容量为64KB(../include/linux/pipe_fs_i.h)

    #define  ..buffer   16  //16*4kb

 >无名管道: 

   无名管道被创建后等同于操作文件,读端被视为一个文件,在写端也被视为一个文件。

   无名管道:只能用于父进程和子进程间的通信。

   创建无名管道:

       int pipe(int pipefd[2]);  // 成功返回0,失败返回-1

       pipefd[0],返回2个文件描述符中的读端,pipefd[1],返回2个文件描述符中的写端,   

       *注意需要在fork之前创建管道。

      关闭管道:close

      读管道:read

      写管道:write

      程序例子:  

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <stdlib.h>
void main()
{
  pid_t pid;
  int pipefd[2];
  char buf[10];
  pipe(pipefd);//先创建一个管道
  pid=fork();//创建一个进程
  if(pid>0) //父进程
  {
   write(pipefd[1],"hello",6);//写管道
   wait();//wait for read
   close(pipefd[1]);//关闭
   exit(0);
  }
  if(pid==0) //子进程
  {
   read(pipefd[0],buf,6);
   printf("%s\n",buf);
   close(pipefd[0]);
   exit(0);
  }
}

     

 >有名管道

    FIFO|pipe区别:

     读取fifo文件的进程只能一只读的方式打开。

     写fifo文件的进程只能以只写的方式打开。

     数据被进程读出后,管道中的数据就不存在。

    创建有名管道:

         int mkfifo(const char * pathname,mode_t mode);//创建一个fifo 文件(有名管道)

         pathname:要创建文件的名字-含路径

         mode:创建文件的权限

    删除有名管道

         int unlink(const char * pathname);

    打开open 写 write 读read 关闭 close

     

//write.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <stdlib.h>
void main()
{
  int fd;
  mkfifo("/tmp/myfifo",0666);//先创建一个管道
  fd=open("/tmp/myfifo",WRONLY);//先创建一个管道</span>
  write(fd,"hello",6);//写管道,当写入的时候没有读进程会进入阻塞
  close(fd);//关闭
}
//read.c
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <stdlib.h>
void main()
{
  int fd;
  char buf[15];
  fd=open("/tmp/myfifo",WRONLY);//先创建一个管道</span>
  read(fd,buf,6);//写管道
  printf("%s\n",buf);
  close(fd);//关闭
  unlink("/tmp/myfifo");//删除管道</span>
}


 
 


 


    

   




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值