进程通信 (命名管道 单向通信)

 client.c:
 1 #include<stdio.h>
  2#include<stdlib.h>
  3#include<string.h>
  4#include<sys/stat.h>
  5#include<sys/types.h>
  6#include<unistd.h>
  7#include<fcntl.h>
  8#define _PATH_ "./tmp"
  9#define SIZE 100
 10int main()
 11 {
 12 if(mkfifo(_PATH_,0666|S_IFIFO)<0)
 13   {
 14    perror("mkfifo");
 15    return -1;
 16   }
 17   intfd=open(_PATH_,O_WRONLY);
 18  if(fd<0)
 19   {
 20   perror("open");
 21   return -1;
 22   }
 23  char buf[SIZE];
 24  memset(buf,‘\0‘,SIZE);
 25  while(1)
 26  {
 27   scanf("%s",buf);
 28   write(fd,buf,strlen(buf));
 29  }
 30 close(fd);
 31 return 0;
 32 }
 
 
 server.c:
 
 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<sys/stat.h>
5 #include<sys/types.h>
6 #include<unistd.h>
  7#include<fcntl.h>
  8#define _PATH_ "./tmp"
  9#define SIZE 100
 10int main()
 11 {
 12   intfd=open(_PATH_,O_RDONLY);
 13  if(fd<0)
 14   {
 15   perror("open");
 16   return -1;
 17   }
 18  char buf[SIZE];
 19  while(1)
 20  {
 21
 22  memset(buf,‘\0‘,SIZE);
 23   read(fd,buf,sizeof(buf));
 24   printf("%s\n",buf);
 25  }
 26 close(fd);
 27 return 0;
 28 }
 
 
 
 Makefile:
 
  1.PHONY:all
  2 all:client server
  3 server:server.c
  4         gcc -o [email protected] $^
  5client:client.c
  6         gcc -o [email protected] $^
  7.PHONY:clean
  8clean:
  9         rm -f client server tmp

时间: 2024-10-26 12:34:03

进程通信 (命名管道 单向通信)的相关文章

Linux学习笔记(13)-进程通信|命名管道

匿名管道只能在具有亲属关系的进程间通信,那么如果想要在不具有亲戚关系,想在陌生人之间通信,那又该怎么办呢? 别慌,Linux身为世界上*强大的操作系统,当然提供了这种机制,那便是命名管道-- 所谓命名管道,那便是拥有名字的管道,同时也被称之为FIFO,谈到FIFO,那么做过单片机开发的同学想必是不陌生的. 在很多单片机的项目中,都使用过FIFO,FIFO其实是一种队列,先进先出,这样可以保证读出数据和写入数据的一致性. 使用FIFO文件,便可以在不同的,且不具有亲属关系的进程中进程通信. 创建命

C# 进程通信-命名管道

之前看wcf服务的时候看到wcf有支持管道通信协议,之前不知道,最近刚好有用到这个,这里写个简单实例 .net有已经封装好的pip通信的对象NamedPipeServerStream 和NamedPipeClientStream对象,底层应该还是调用C++实现的api实现的 对服务端和客户端做个简单的封装方便调用: server: public class PipServer:Log { public Action<string> ReceiveEvent; NamedPipeServerSt

进程通信(管道 单向通信)

 1 #include<stdio.h>  2#include<sys/wait.h>  3#include<unistd.h>  4#include<string.h>  5#include<stdlib.h>  6int main()  7 {  8    int pipefd[2];  9    if(pipe(pipefd)==-1)  10    {  11     perror("pipe");  12     r

进程通信——命名管道通信

private static void WaitData() { using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1)) { try { pipeServer.WaitForConnection(); pipeServer.ReadMode = PipeTransmissionMode.Byte; using (StreamReade

进程通信之管道

本节学习进程通信的另一种方式:管道.管道是一个进程连接数据流到另一个进程的通道,它通常把一个进程的输出通过管道连接到另一个进程的输入.在shell命令中经常会看到管道的应用,比如我们要列出当前文件下所有命名中有"test"的文件:ls -l | grep test.其中"|"就代表我们在使用管道,它会把"ls -l"的查询结果通过管道,发送给grep,然后执行"grep test"命令后把结构输出到终端.总之一句话:管道会把一

Linux下进程通信之管道

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication).如下图所示. 目前进程通信的方式有: 管道 FIFO 消息队列 信号量 共享内存 套接字 管道 管道概念 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数

c# c++通信--命名管道通信

进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c++:LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); c#:new NamedPipeClientStream("localhost", "mynamedpipe", PipeDirect

进程通信——匿名管道

有的时候在程序的开发过程中,两个进程之间会有数据的交互.信号的机制能够实现进程通信.它通过 “中断--响应” 的异步模式来工作.但作为通信来讲,信号还是远远不够的.因为它不能够携带任何其他的信息.只利用信号机制来实现进程通信显得捉襟见肘,并且信号的优势并不此.所以必须开发新的进程间通信的方法.本文所学习的 "匿名管道" 便是其中的一种最简单的方法. 基本概念 在讲管道的基本概念之前,首先提一个问题.如果让你来设计进程通信的方式,你会怎么做?最简单的方式莫过于两个进程打开同一个文件,这样

进程通信-无名管道

无名管道:主要是针对进程通信的(自己感觉它有很大的局限性) 特点:它不是一个文件系统,不能按名访问,这也是它和有名管道之间最大的区别.无名管道只是一个系统内存里面的东西. 半双工模式,数据只能流向一个方向(老师给我们举得例子就是水厂的水到居民用水,不可能倒着流对吧). 进程之间通信,但是只能是有亲缘关系的进程才能进行通信?比如父子进程:因为在父子进程中,子进程拷贝父进程的数据段,这让这两个进程在通信的时候就有了相连的关系. 下面我们来看一下:无名管道的创建,写入,读取,关闭(我用的的是Liunx

linux进程通信之管道

1.介绍: 1)同一主机: unix进程通信方式:无名管道,有名管道,信号 system v方式:信号量,消息队列,共享内存 2)网络通信:Socket,RPC 2.管道: 无名管道(PIPE):使用一个进程的标准输出作为另一个进程的标准输入建立的一个单向管道,执行完成后消失.主要用于父进程与子进程之间,或者两个兄弟进程之间.采用的是单向 1)创建无名管道:(#include(unistd.h)) extern int pipe(int pipes[2]),pipes[0]完成读操作,pipes