本文主要是介绍linux进程间通信学习-管道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
进程间通信(Inter-Process Communication)就是指多个进程之间相互通信,交换信息的方法。Linux IPC基本上都是从Unix平台上继承而来的。主要包括最初的Unix IPC,System V IPC以及基于Socket的IPC。
进程间通信主要包括管道,命名管道, 系统IPC(Inter-Process Communication,进程间通信)(包括消息队列,信号,共享存储), 套接字。
管道(PIPE)
创建管道
#include<unistd.h>
int pipe(int fd[2]);
函数通过fd返回两个文件描述符,描述符fd[0]只能用于读,描述符fd[1]只能用于写,一般的文件操作都能用于管道,如close,read,write等。
<pre name="code" class="cpp">#include<stdlib.h>
#define MAXLINE 1024
int main()
{int n;int fd[2];char line[MAXLINE];pid_t pid;if(pipe(fd)<0){ perror("pipe error\n");return -1;} if((pid=fork())<0){ perror("fork error\n");return;} else if(pid>0){ close(fd[0]);write(fd[1],"Hello World\n",12); } else{ sleep(1);close(fd[1]);n=read(fd[0],line,MAXLINE);write(STDOUT_FILENO,line,n);}return 0;
}
在调用fork之前创建一个管道,fork之后父进程关闭其读端,子进程关闭其写端,父进程向该管道写入数据,子进程从其中读取数据,完成进程间通信。
popen和pclose函数
#include<stdio.h>
FILE* popen(const char *command,const char * type);
popen函数首先执行fork操作,然后调用exec执行command,同时返回一个标准I/O文件指针(该文件指针只能用pclose关闭),如果type是"r",则文件指针连接到command的标准输出,如果type是"w",则文件指针连接到command的标准输入。
一个例子:
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAXLINE 1024
int main()
{FILE* fd;char line[MAXLINE];int n;memset(line,'\0',MAXLINE);if((fd=popen("pwd","r"))==NULL){perror("popen error\n");return -1;}fgets(line,MAXLINE,fd);printf(line);if(pclose(fd)==-1){perror("pclose error\n");return -1;}return 0;
}
运行结果:
django@ubuntu:~/Desktop/apue/IPC$ ./a.out
/home/django/Desktop/apue/IPC
这篇关于linux进程间通信学习-管道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!