/*************************************************************************
> 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);
}
//经验;