c/c++ linux 进程间通信系列3,使用socketpair,pipe

linux 进程间通信系列3,使用socketpair,pipe

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

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

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

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

疑问:在代码2里不写wait函数的话,父进程不能结束,但是在代码3里也没有写wait函数,父进程却可以结束???

1,使用socketpair:

#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]\n", buf);
    exit(0);
  }
  else {
    int status;
    close(sv[1]);
    write(sv[0], "HELLO", 5);
    printf("parent process : child process id %d\n", pid);
    wait(&status);
  }

  return 0;
}

github源代码

2,使用pipe:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>

int main(){
  int p[2];
  pid_t pid;
  char buf[128];

  memset(buf, 0, sizeof(buf));

  if(pipe(p) != 0){
    perror("pipe");
    return 1;
  }

  pid = fork();
  if(pid < 0){
    perror("fork");
    return 1;
  }

  if(pid == 0){
    close(p[1]);
    read(p[0], buf, sizeof(buf));
    printf("child process : data form parent process [%s]\n", buf);
    exit(0);
  }
  else{
    close(p[0]);
    write(p[1], "aaaa", 4);
    printf("parent process : child process is %d\n", pid);
    int status;
    wait(&status);
  }
  return 0;
}

github源代码

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>

int main(){
  int p[2];
  pid_t pid;
  char buf[1024];

  memset(buf, 0, sizeof(buf));

  if(pipe(p) != 0){
    perror("pipe");
    return 1;
  }

  pid = fork();
  if(pid < 0){
    perror("fork");
    return 1;
  }
  if(pid == 0){
    printf("child process : my_id=%d\n",getpid());

    close(p[0]);
    //把标准输出给管道1了
    dup2(p[1], fileno(stdout));

    char *argv[ ]={"ls", "/home/ys/cpp/network"};
    //利用ls命令,往标准输出里,输入文件夹里文件的的名字,标准输出又连接到了上面开的管道1里。
    if(execve("/bin/ls", argv, NULL) < 0){
      perror("exec");
      return 1;
    }
    exit(0);
  }else{
    int n;
    FILE* filep;

    close(p[1]);
    printf("parent process : child process id=%d\n", pid);

    //先打开管道1
    filep = fdopen(p[0], "r");
    if(filep == NULL){
      perror("fdopen");
      return 1;
    }

    //再从管道1里读取数据
    while(fgets(buf, sizeof(buf), filep) != NULL){
      printf("get:%s\n", buf);
    }
    int status;
    wait(&status);
  }
  return 0;
}

github源代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9820598.html

时间: 2024-07-31 19:25:36

c/c++ linux 进程间通信系列3,使用socketpair,pipe的相关文章

c/c++ linux 进程间通信系列7,使用pthread mutex

linux 进程间通信系列7,使用pthread mutex #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <pthread.h> #include <sys/wait.h> int main(){ pthread_mutex_t *m; pthread_mutexattr_t mat; int shmi

Linux 进程间通信系列之 信号

信号(Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数) 信号种类 每种信号类型都有对应的信号处理程序(也叫信号的操作),就好像每个中断都有一个中断服务例程一样.大多数信号的默

Linux进程间通信总结

Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出

深刻理解Linux进程间通信(IPC)

深刻理解Linux进程间通信(IPC) 郑彦兴 原文地址:http://www.ibm.com/developerworks/cn/linux/l-ipc/index.html 一个大型的应用系统,往往需要众多进程协作,进程(Linux进程概念见附1)间通信的重要性显而易见.本系列文章阐述了Linux环境下的几种主要进程间通信手段,并针对每个通信手段关键技术环节给出详细实例.为达到阐明问题的目的,本文还对某些通信手段的内部实现机制进行了分析. 序 linux下的进程通信手段基本上是从Unix平台

练习--LINUX进程间通信之消息队列MSG

https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某

Linux 进程间通信(IPC)

Linux 进程间通信(IPC): Linux系统中除了进程和进程之间通信,我想大家也应该关注用户空间与内核空间是如何通信的,比方说netlink等等.除了传统进程间通信外像Socket通信也需要掌握的! /*-------------------------------------------------------------------------- * Project: aipc.c * Name: zwp * Date: 2014/6 *------------------------

linux 工具系列之 - strace

 what is strace ? Linux 解释 从字面意思上就可道 strace 跟踪程序执行时候的系统调用和信号. how use? man 一下strace 发现它的参数一大坨,是不是很郁闷,不用担心,其实我们只要记住几个常用的参数就可以搞定绝对大多数问题啦 注意 test指可执行文件 strace  -i 查看可执行文件的系统调用 -i  查看可执行文件在那个地址进行了系统调用,可配合gdb -p " pid of test" 附加到运行的进程 Ctrl  +c 结束 -o

Linux进程间通信 -- 消息队列 msgget()、msgsend()、msgrcv()、msgctl()

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条

Linux进程间通信 -- 信号量函数 signal()、sigaction()

一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的.但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程.一个信号的产生叫生成,接收到一个信号