高级IO中socketpair实现进程间通信以及重定向

sockpair实现进程间通信

我们以前学习的利用管道(此处为匿名管道)实现进程间通信,只能是单向的,一边只能读而另一边只能写,且只能在有血缘关系的进程间才能通信,若想实现双向通信就必须创建双向管道,而sockpair它的实现就是双向管道进行通信。它可以用来创建双向通信管道

1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/socket.h>
  6 #include<stdlib.h>
  7 #include<errno.h>
  8 
  9 int main()
 10 {
 11     int sv[2]={0,0};
 12     char buf[1024];
 13     int sock_pair=socketpair(AF_LOCAL,SOCK_STREAM,0,sv);
 14     if(sock_pair < 0)
 15     {
 16         perror("socketpair");
 17         exit(1);
 18     }
 19     pid_t id=fork();
 20     if(id<0)
 21     {
 22         perror("fork");
 23         return -1;

24     }else if(id==0){ //child

25         close(sv[0]);

26         while(1)

27         {

28             memset(buf,‘\0‘,sizeof(buf));

29             strcpy(buf,"I‘m child");

30             write(sv[1],buf,strlen(buf));

31             ssize_t _size=read(sv[1],buf,sizeof(buf)-1);

32             if(_size<0)

33             {

34                 perror("read");

35                 return -2;

36             }else if(_size > 0)

37             {

38                 buf[_size]=‘\0‘;

39                 printf("father->child:%s\n",buf);

40             }

41             sleep(1);

42         }

43         close(sv[1]);

44

45     }else

46     {

47         close(sv[1]);

48         while(1)

49         {

50             ssize_t _size=read(sv[0],buf,sizeof(buf)-1);

51             if(_size<0)

52             {

53                 perror("read");

54                 exit(2);

55             }else if(_size >0)

56             {

57                 buf[_size]=‘\0‘;

58                 printf("child->father:%s\n",buf);

59             }

60 //          memset(buf,‘\0‘,sizeof(buf));

61             strcpy(buf,"I‘m father");

62             write(sv[0],buf,sizeof(buf)-1);

63         }

64         close(sv[0]);

65     }

66     return 0;

67 }

程序运行结果:

重定向:对文件描述符进行重定向

例:将一个文件中的内容打印到标准输出上,若关闭了标准输出文件描述符,此时再打开一个文件,文件描述符将为1,而此时第一个文件的内容将会被打印到文件中(即重定向)

若新创建一个进程文件描述符会从3(若0、1、2都不关)开始?

当打开一个终端时,该过程即为创建一个会话的过程,会有一个控制进程bash,也就是会话首进程,关联terminal终端后会默认填上标准输入、标准输出以及标准错误,因此在当下创建的进程都为子进程,又因子进程在创建时会继承父进程的文件描述符,因此创建一个进程后文件描述符会从3开始。

使用dup重定向:函数原型 int dup(int oldfd)

例:关闭1号文件描述符(标准输出),本应将标准输入的内容打印到标准输出上,重定向到了log文件中

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<fcntl.h>
  5 #include<string.h>
  6 #include<errno.h>
  7 #include<sys/stat.h>
  8 
  9 int main()
 10 {
 11     int fd=open("./log",O_CREAT|O_RDWR,0644);
 12     if(fd<0)
 13     {
 14         perror("open");
 15         exit(1);
 16     }
 17     close(1); //必须关闭要重定向的文件描述符
 18     int newfd=dup(fd);
 19     if(newfd <0)
 20     {
 21         perror("dup");
 22         exit(2);
 23     }

24     char buf[1024];

25

26     while(1)

27     {

28         memset(buf,‘\0‘,sizeof(buf));

29         fgets(buf,sizeof(buf),stdin);

30         if((strncmp("quit",buf,4))==0)

31         {

32             break;

33         }

34         printf("%s\n",buf);

35         //printf("hello world\n");

36         fflush(stdout);

37     }

38     close(newfd);

39

40     return 0;

41 }

输入内容:

重定向到log文件中内容

int dup2(int oldfd,int newfd)

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<fcntl.h>
  5 #include<string.h>
  6 #include<errno.h>
  7 #include<sys/stat.h>
  8 
  9 int main()
 10 {
 11     int fd=open("./log",O_CREAT|O_RDWR,0644);
 12     if(fd<0)
 13     {
 14         perror("open");
 15         exit(1);
 16     }
 17     close(1); //可以不必关闭1号文件描述符
 18     int newfd=dup2(fd,1);
 19     if(newfd <0)
 20     {
 21         perror("dup");
 22         exit(2);
 23     }

24     char buf[1024];

25     while(1)

26     {

27         memset(buf,‘\0‘,sizeof(buf));

28         fgets(buf,sizeof(buf),stdin);

29         if((strncmp("quit",buf,4))==0)

30         {

31             break;

32         }

33         printf("%s",buf);

34         //printf("hello world\n");

35         fflush(stdout);

36     }

37     close(newfd);

38

39     return 0;

40 }

41

输入内容:

log文件中内容:

时间: 2024-08-29 12:40:01

高级IO中socketpair实现进程间通信以及重定向的相关文章

高级IO编程

一.5种I/O模型 一个I/O可以分为两个过程:等待和数据搬迁. 1.阻塞I/O 两个过程都有自己来完成,其他什么事也不做. 2.非阻塞I/O 在等的过程中可以干一些其他的事,等到数据准备好再进行搬迁 3.信号驱动I/O 等数据准备好的过程由信号来触发,在这期间自己可以干一些别的事 4.I/O复用 同时阻塞多个I/O操作,谁数据准备好就对其进行数据搬迁. 5.异步I/O 将任务派发,不用自己来完成.完成之后通知自己就行. 二.高级I/O 非阻塞IO,纪录锁,系统V流机制,I/O多路转接(sele

(十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制 (七) 一起学 Unix 环境高级编程 (APUE)

UC高级编程--利用信号实现进程间通信

/********************************************************************** *Copyright (c) 2014,TianYuan *All rights reserved. * * 文件名称: sigin.c * 文件标识:无 * 内容摘要:利用信号实现进程间通信,测试代码. 把要发送的数据存放到文件中,并发送信号. * 其它说明:无 * 当前版本: V1.0 * 作 者: wuyq * 完成日期: 20140711 * *

java之十 高级IO流

java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOutputStream.PutField是Java2新添的内部类. java.io包还包含两个不受java2欢迎的类,这两个类没有在上表中列出:LineNumberInputStream和StringBufferInputStream.新代码不应该使用两个类. 下面是由java.io定义的接口: FileFilter接口是Java2新增的. java.io包中有很多类和接口.包括字节和

C# 操作 Word 修改word的高级属性中的自定义属性

word的类库使用的是word2007版本的类库,类库信息见下面图片,折腾了半天,终于找到入口,网上 很多说的添加或者修改word的高级属性中的自定义属性都是错误的,感觉都是在copy网上的代码,自己终于摸索成功了,Mark下. 直接上代码,代码如下: [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

高级IO

高级IO: 五种IO模型:阻塞IO; 非阻塞IO; 信号驱动IO:异步IO:多路转接IO IO操作分为两个过程:等待/数据拷贝 阻塞IO: 发起IO调用后,若不具备IO条件,则等待IO条件具备,拷贝数据后返回 非阻塞IO: 发起IO调用后,若不具备IO条件,则立即报错返回,若具备IO条件则立即拷贝数据后返回 信号驱动IO: 先定义IO信号处理,若IO条件具备则直接信号通知进程,发起调用,拷贝数据后返回 异步IO: 先定义IO信号处理,发起异步IO调用,直接返回.让别人进行IO等待,等待IO条件具

IO中同步异步,阻塞与非阻塞 -- 原理篇

再补一篇高手写的理论分析,便于更深刻理解 转自:http://blog.csdn.net/historyasamirror/article/details/5778378 ============================================================= 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答

socket.io 中文手册 socket.io 中文文档

socket.io 中文手册,socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on('connection',function(socket));//监听客户端连接,回调函数会传递本次连接的socket io.sockets.emit('String',data);//给所有客户端广播消息 io.sockets.socket(socketid).emit('String', data);//给指

unix高级编程中的一个头文件 apue.h 与一个差错文件error.c 的内容

在查看unix高级编程中的代码时,如果我们编写书中的代码,发现一般都会报错,这是因为作者在写这本书时,他自己编写了一个头文件,跟一个差错处理文件,出来处理他自己的代码错误信息: 下面我们来看下代码的内容: 我实现第一个代码,关于文件的打开,实现 ls 命令的代码: #include "apue.h"#include <stdio.h>#include <dirent.h> int main(int argc, char *argv[]){ DIR *dp; st