进程通信-无名管道PIPE

进程间通信方式:

古老方式:
无名管道:PIPE
有名管道:FIFO  named pipe
信号:signal

系统IPC(进程间通信)
信号量(sem)
共享内存(shm)
消息队列(msg)

BSD:
套接字:socket


先说无名管道PIPE

PIPE:无名管道
原型:int pipe(int pipefd[2]);头文件为unistd.h
参数:两个文件描述符
说明:pipe()创建一个管道,一个单向数据通道,可用于进程间通信,pipefd用于返回两个文件描述符指管端.
         pipefd[0]指管道的读端,pipefd[1]指管道的写端.写入管道的写入端的数据被内核缓冲,直到从管道
         的读取端读取.
     适用于亲缘关系的进程中,随进程结束而结束,先申请管道,在创建进程,最后完成读写操作.
返回值:成功返回0,失败返回-1

测试代码:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include <fcntl.h> 
void main(){
	int pipefd[2];
	pid_t fd;
	char test[]="pipe test is runing";
	char reader[24]={0};
	
	if(pipe(pipefd)==-1){
		printf("create pipe error!\n");
		exit(0);
	}

	fd=fork();
	if(fd==-1){
		printf("fork error!\n");
		exit(0);
	}
	//getpid返回当前进程标识,getppid返回父进程的标识
	if(fd==0){
		printf("child process:getpid:%d,getppid:%d,pid:%d\n",getpid(),getppid(),fd);
		close(pipefd[0]);//关闭读  完成写
		write(pipefd[1],test,strlen(test));
	}
	else{
		printf("parent process:getpid:%d,getppid:%d,pid:%d\n",getpid(),getppid(),fd);
		close(pipefd[1]);
		read(pipefd[0],reader,strlen(test));
		printf("reader is:%s\n",reader);
	}	
	return;
}
测试结果:

[root@libmaster zxd]# ./a.out 
parent process:getpid:1206,getppid:601,pid:1207
child process:getpid:1207,getppid:1206,pid:0
reader is:pipe test is runing




猜你喜欢

转载自blog.csdn.net/linuxzhuxiaodi/article/details/78505515