利用管道进行通信

管道简介:

管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。

关于管道的代码实例

此程序是关于管道的创建和读写和关闭
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
  int fd[2];
  char str[256];

  if( pipe(fd) < 0 )
    {
      perror("pipe");
      exit(1);
    }

  write(fd[1],"create the pipe successfully!\n ",31);

  read(fd[0],str,sizeof(str));
  printf("%s",str);

  printf("pipe file descriptors are %d ,%d\n",fd[0],fd[1]);

  close(fd[0]);
  close(fd[1]);
 return 0;
}
此程序说明管道内的数据在读出之后就没有了
#include<stdio.h>
#include<unistd.h>
int main()
{
   int filedes[2];
   char buffer[20];

   pipe(filedes);
   if( fork()> 0)
    {
     char s[]="hello\n";
     write(filedes[1],s,sizeof(s));
    }
    else
    {
      read(filedes[0],buffer,80);
      printf("%s\n",buffer);
    }

   read(filedes[0],buffer,80);
   printf("%s\n",buffer);
  close(filedes[0]);
  close(filedes[1]);

  return 0;
}
父子进程之间的通过管道进行通信
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>

int main()
{
   int    fd[2];
   char   buf[20];
   pid_t  pid;
   int    len;

   if( pipe(fd) < 0 )
    {
      perror("failed to pipe;");
      return 1;
    }

   if( ( pid = fork() ) < 0 )
     {
      perror("failed to fork;");
     return 1;
     }
   else if( pid > 0 )
    {
     close(fd[0]);
     write(fd[1],"hello my son\n",14);
     return 0;
    }
    else
     {
       close(fd[1]);
       read(fd[0],buf,20);
       printf("%s\n",buf);
     }
  return 0;
}
兄弟进程之间进行通信
要点:需要在第二次创建一个子进程的时候关闭父进程管道的两端,
而不是第一次,这样做的目的是继承一个存活的管道。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>

 int main( void )
 {
   int fd[2];
   char buf[100];
   pid_t pid;
   int len;

   if( pipe(fd) < 0 )
      perror("pipe");

   if( ( pid = fork() ) < 0)
    perror("fork1");
   else  if( pid == 0 )
    {
     close(fd[0]);
     write(fd[1],"hello brother!",20);
     exit(0);
    }

  if( ( pid = fork() ) < 0)
     perror("fork2");
   else if( ( pid > 0  ) < 0)
     {
        close(fd[0]);
        close(fd[1]);
         exit(0);
     }
   else
    {
     close(fd[1]);
     read(fd[0],buf,20);
     printf("%s\n",buf);
    }
  return 0;
 }
时间: 2024-10-08 06:47:38

利用管道进行通信的相关文章

进程间通信---在父进程跟子进程之间利用管道进行通信。一个简单的例子

#include <fcntl.h> //提供open函数 #include <sys/types.h> // 该头文件提供系统调用的标志 #include <sys/stat.h> // 该头文件提供系统状态信息和相关函数 #include <sys/uio.h> // 该头文件提供进程I/O操作的相关函数 #include <unistd.h> // 标准函数库 #include <fcntl.h> // 文件操作相关函数库 #i

利用管道实现进程间通信

管道通信 匿名管道 创建匿名管道 int pipe(int pipefd[2]);pipefd[0] : 表示读管道pipefd[1] : 表示写管道返回 0表示成功,非零表示创建失败. 代码事例: //匿名管道 int main() { int fds[2]; int len; char buf[100]={}; if(pipe(fds)==-1) //创建管道 perror("pipe"),exit(1); while(fgets(buf,100,stdin)) { len = s

命名管道进程通信

命名管道进程通信 效果:server读取client发送的字符串. server: client: control: 运行效果 命名管道进程通信

有名管道进程通信

一.任务 1.学习mkfifo等函数: 2.了解有名管道的特点.阻塞打开与非阻塞打开等: 3.编写一个关于有名管道进程通信的程序,并运行. 二.相关概念 1.相关函数 创建有名管道的函数是mkfifo,函数原型是: int mkfifo (const char *__path, __mode_t __mode) 功能:创建新的带命名路径的FIFO 参数:path - 命名管道路径 mode - 模式权限 返回值:成功返回0,失败返回-1: 2.有名管道的特点 a).使不同进程之间完成通信. 通过

今晚八点 golang 分享《如何在60分钟掌握 go 协程&amp;管道 &amp; socket 通信》

今晚八点 golang 分享<如何在60分钟掌握 go 协程&管道 & socket 通信> 内容如下: 功能演示 知识点学习 Golang 介绍 go 并发编程与通信 TCP/IP 协议族 socket 实战 使用 go net 模块开发 tcp 服务器与客户端 代码讲解 分享时间:2019.5.28——20:00-21:30 主讲人:kk 多语言混搭开发工程师,多年 PHP.Python 项目开发经验,带领团队完成多个中.小型项目开发.擅长于 Web 安全开发.性能优化.分

java netty socket库和自定义C#socket库利用protobuf进行通信完整实例

之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C# 和 java的通信.以及完整的实例代码 java 代码 svn 地址,本人开发工具是NetBeans 8.0.2 使用 maven 项目编译 http://code.taobao.org/svn/flynetwork_csharp/trunk/BlogTest c# 代码 svn 地址 使用的是

利用管道迁移数据

磁盘空间不足的情况下,利用命名或者匿名管道迁移和导入数据:需要注意命名管道的权限问题. 0. Name PIP 0 [[email protected] ~]$ psql gtlions -ac "select 't3' tab,count(*) from t3 union all select 't4',count(*) from t4;" select 't3' tab,count(*) from t3 union all select 't4',count(*) from t4;

利用管道获取控制台程序的标准输出

1.该程序调用控制台程序hello.exe,通过管道获取到hello.exe的标准输出数据,并打印到当前程序的标准输出. #include <Windows.h> #include <iostream> #include <string> using namespace std; void invoke(string exe); int main(int argc, char* argv[]) { string exe = "hello.exe";

python-无名管道进程通信

1 #!/usr/bin/python 2 #coding=utf-8 3 import sys,os 4 from time import sleep 5 6 (r,w)=os.pipe() #创建无名管道,返回两个整数,代表两个管道文件,且代表的功能是(r,w) 7 pid=os.fork() 8 9 if pid<0: 10 print "fail to fork" 11 elif pid==0: 12 print "child",os.getpid()