linux---pipe管道实现父子进程通信的测试

/*************************************************************************
	> File Name: pipi_test.c
	> Author: xuchen_allen
	> Mail: [email protected] 
	> Created Time: 2019年02月01日 星期五 15时38分25秒
 ************************************************************************/

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

//练习一下pipe的写法;
/*
#include<unistd.h>

int pipe(int filedes[2]);

返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述符。fd[0]:读管道,fd[1]:写管道。

必须在fork()中调用pipe(),否则子进程不会继承文件描述符。两个进程不共享祖先进程,就不能使用pipe。但是可以使用命名管道。
 */


int main(void)
{
	int n;
	int fd[2];
	pid_t pid;
	char *buf[100];
	
	//创建管道:
	int k=pipe(fd);
	if(k==-1){
		perror("pipe fail:");
		exit(1);
	}
	//fd[0]为读;
	//fd[1]为写;

	//创建子程序:
	pid =fork();

	if(pid == -1){
		//创建子进程失败
		perror("fork fail");
		exit(1);
	}
	else if(pid == 0){
		//进入子进程;
		//子进程从管道中读取内容,所以关闭写,打开读;
		sleep(1);
		printf("Child\n");
		close(fd[1]);
		n = read(fd[0],buf,100);
		write(STDOUT_FILENO,buf,n);//所存数据少于buf缓冲区的数据,所以只要一次写操作就行;
	}
	else{
		//父进程,向pipe中写入数据;
		close(fd[0]);
		write(fd[1],"hello world\n",12);
		sleep(2);
		printf("Parent\n");
	}
	exit(0);
}
//此时稳定输出,能在屏幕上顺序出现child hello parent的输出;

//直接在屏幕输出;

/*************************************************************************
	> File Name: pipe_test_2.c
	> Author: xuchen_allen
	> Mail: [email protected] 
	> Created Time: 2019年02月01日 星期五 16时16分30秒
 ************************************************************************/

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

int main(void)
{
	//当buf长度小于要读入的字符串长度时:
	
	int fd[2];	//pipe的数组;
	char *buf[1];	//缓冲区;
	pid_t pid ;
	int ret_W;

	//创建pipe:
	if(pipe(fd)<0){
		perror("pipe fail:");
		exit(1);
	}

	//创建子进程:
	pid = fork();
	if(pid<0){
		perror("fork fail");
		exit(1);
	}
	else if(pid == 0){
		//此时在子进程中:
		//fd[0]读,fd[1]写:
		//此时关闭写,打开读:
		printf("child\n");
		close(fd[1]);
	   while(ret_W=read(fd[0],buf,sizeof(buf)))//向fd[0]中读入数据:
			write(STDOUT_FILENO,buf,ret_W);
		
	}
	else{
		//此时进入父进程,向fd[1]中写入数据:
		printf("parent\n");
		close(fd[0]);
		write(fd[1],"hello world again\n",18);
	}
	exit(0);
}

//不同的输入方法;

/*************************************************************************
	> File Name: pipe_test_3.c
	> Author: xuchen_allen
	> Mail: [email protected] 
	> Created Time: 2019年02月01日 星期五 16时35分14秒
 ************************************************************************/

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

//测试3:打开一个文件,pipe通信,父传到子;

int main(void)
{
	int pipe_fd[2];
	pid_t pid;
	char *buf[2048];
	int fd;

	//先打开一个文件:
	fd = open("test",O_RDONLY);
	if(fd==-1){
		perror("open fail");
		exit(1);
	}
	

	//创建一个pipe:
	if(pipe(pipe_fd)<0){
		perror("pipe fail:");
		exit(1);
	}

	//创建子进程:
	pid = fork();
	if(pid < 0){
		perror("fork fail:");
		exit(1);
	}
	else if(pid>0){
		//此时是父进程;
		//fd[0]读,fd[1]是写;
		close(pipe_fd[0]);

		//先向buf中写入数据,再向pipe中写入数据:
		int k = read(fd,buf,sizeof(buf));
		write(pipe_fd[1],buf,k);
		//在这个读写过程中,如果write紧跟着read调用,或read紧跟着write调用,那么取得前面函数的返回值,并且作为后面函数的参数,避免出现乱码;
	}
	else{
		close(pipe_fd[1]);
		int k = read(pipe_fd[0],buf,sizeof(buf));
		write(STDOUT_FILENO,buf,k);
	}

	exit(0);
}

//经验;

发布了158 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/XUCHEN1230/article/details/86745741