zoukankan      html  css  js  c++  java
  • linux 进程间通信,使用socketpair,pipe

    管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂。socketpair直接就可以实现全双工

    socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写

    1,使用socketpair,实现进程间通信,是双向的。

    2,使用pipe,实现进程间通信

    使用pipe关键点:fd[0]只能用于接收,fd[1]只能用于发送,是单向的。

    3,使用pipe,用标准输入往里写。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/socket.h>
    #include <wait.h>
    
    int main(){
      int sv[2];
      pid_t pid;
      char buf[128];
    
      memset(buf, 0, sizeof(buf));
    
      if(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) != 0){
        perror("socketpair");
        return 1;
      }
    
      pid = fork();
      if(pid < 0){
        perror("fork");
        return 1;
      }
      if(pid == 0){
        close(sv[0]);
        read(sv[1], buf, sizeof(buf));
        printf("child process : data from parant process [%s]
    ", buf);
        exit(0);
      }
      else {
        int status;
        close(sv[1]);
        write(sv[0], "HELLO", 5);
        printf("parent process : child process id %d
    ", pid);
        wait(&status);
      }
    
      return 0;
    }

    使用pipe,做全双工

    #include <stdlib.h>  
    #include <stdio.h>  
      
    int main ()  
    {  
        int fd1[2],fd2[2];  
        pipe(fd1);  
        pipe(fd2);  
        if ( fork() ) {  
            /* Parent process: echo client */  
            int val = 0;  
            close( fd1[0] );  
            close(fd2[1]);  
            while ( 1 ) {  
                sleep( 1 );  
                ++val;  
                printf( "parent Sending data: %d
    ", val );  
                write( fd1[1], &val, sizeof(val) );  
                read( fd2[0], &val, sizeof(val) );  
                printf( "parent Data received: %d
    ", val );  
            }  
        }  
        else {  
            /* Child process: echo server */  
            int val ;  
            close( fd1[1] );  
            close(fd2[0]);  
            while ( 1 ) {  
                read( fd1[0], &val, sizeof(val) );  
                printf( "son Data received: %d
    ", val );  
                ++val;  
                write( fd2[1], &val, sizeof(val) );  
                printf( "son send received: %d
    ", val );  
            }  
        }  
    }  
  • 相关阅读:
    MVC5管道处理模型
    http协议下:为什么请求与响应会做到准确误的对应。不会出现请求与响应的错乱
    修改 IIS 队列长度
    修改 ASP.NET 请求队列的限制
    Windows性能查看器:系统的性能信息(I/O,IIS最大连接数,Sql) ,以及解决 asp.net IIS 一二百多用户并发
    详解 ASP.NET异步
    [C#]获得线程池中活动的线程数
    一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
    IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的...
    ASP.NET MVC 线程和并发
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/12733260.html
Copyright © 2011-2022 走看看