加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix进程间的通信

发布时间:2022-11-01 10:51:02 所属栏目:Unix 来源:
导读:  1. 管道可以用作父子进程之间的通信,pipe函数,将fd[0]打开用于读取数据,fd[1]打开用于写入数据。通常,对于单方向通信,读端会关闭写fd,即fd[1],写端会关闭读fd,即fd[0]

  int main() {
   in
  1. 管道可以用作父子进程之间的通信,pipe函数,将fd[0]打开用于读取数据,fd[1]打开用于写入数据。通常,对于单方向通信,读端会关闭写fd,即fd[1],写端会关闭读fd,即fd[0]
 
  int main() {
      int fd[2];
      int err = pipe(fd);
      char *str = "Hello...";
      //write(fd[1], str, strlen(str));
      err = fork();
      if (err == 0) {
          // child
          write(fd[1], str, strlen(str));
          char buf[30] = {0};
          read(fd[0], buf, 30);
          sleep(2);
          write(STDOUT_FILENO, buf, strlen(buf));
          exit(0);
      } else {
          char buf[30];
  unix进程通信_进程与进程之间的通信_什么层实现进程到进程之间的通信
 
 
          fgets(buf, 30, stdin);
          write(fd[1], buf, strlen(buf));
          waitpid(err, 0, 0);
      }
  }
  void test2() {
      char buf[1000];
      
      // ls | xargs echo
      FILE *f = popen("ls", "r");
       while (0 != fgets(buf, 1000, f)) {
           printf("msg is: %s\n", buf);
       }
      //popen打开的文件,必须使用pclose关闭,而不能使用fclose关闭,否则后续读写会有问题
       printf("ret code is: %d\n", pclose(f));
      // echo 'hi,Jenny' | sed 's/hi/Hello/g'
 
      FILE *f2 = popen("sed 's/hi/Hello/g'", "w");
      fputs("hi,Jenny", f2);
      pclose(f2);
  }
  2. fifo 就像是一个文件。可以执行命令mkfifo或者使用mkfifo函数创建fifo。创建的文件的标志会持久化在磁盘上,但是fifo的内容和进程的声明周期是相同的unix进程通信,也就是如果进程关闭这个fd(准确的说是所有进程都关闭这个fd),则写入fifo的数据就不复存在了。可以使用ls -F选项查看文件类型,fifo会以|结尾,属性以p开头。如果一个进程企图为只读打开一个没有等待写入的fifo,会阻塞;如果一个进程企图为只写打开一个没有等待读取的fifo,会阻塞。为读写而打开的fifo不会被阻塞。
 
  int main() {
      mkfifo("/tmp/srv",S_IRWXU|S_IRGRP|S_IROTH);
      int fd = open("/tmp/srv", O_RDWR);
      printf("the fd is %d\n", fd);
      for (;;){
          write(fd, "Hello, world!", 5);
          sleep(1);
      }
  }
  3. 对于pipe或者fifo,如果请求读出的数据量小于pipe/fifo中的数据量,则只返回可用数据;如果请求写入的数据量小于PIPE_BUF,则write操作是原子的。
 

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章