Linux环境下,进程地址空间相互独立,每个进程都有不同的用户地址空间,一个进程的全局变量在另一个中是看不到的,要交换数据必须通过内核,在内核中开辟一块缓冲区,一个进程写,另一个读,这种机制就是进程间通信
常用的进程间的通讯方式有以下几种:
pipe函数
函数调用成功返回读端和写端的文件描述符,其中fd[0]是读端, fd[1]是写端,向管道读写数据是通过使用这两个文件描述符进行的,读写管道的实质是操作内核缓冲区
创建步骤总结:
...... int main() { int fd[2]; int ret = pipe(fd); if(ret<0) { perror("pipe error"); return -1; } pid_t pid=fork(); if((pid<0)) { perror("fork error"); return -1; } else if(pid>0) { close(fd[0]); sleep(5); write(fd[1],"hello world",strlen("hello world")); wait(NULL); } else { close(fd[1]); char buf[64]; memset(buf,0x00,sizeof(buf)); int n=read(fd[0],buf,sizeof(buf)); printf("read over, n==[%d], buf==[%s]\n", n, buf); } return 0; } ......
FIFO常被称为命名管道,以区分管道(pipe)。管道(pipe)只能用于“有血缘关系”的进程间通信。但通过FIFO,不相关的进程也能交换数据。
创建方式:
命令:mkfifo 管道名
库函数:int mkfifo(const char *pathname, mode_t mode); 成功:0; 失败:-1
一旦使用mkfifo创建了一个FIFO,就可以使用open打开它,常见的文件I/O函数都可用于fifo。如:close、read、write、unlink等。
使用FIFO进行进程间通讯:
进程A:
进程B: