管道包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。
无名管道由pipe()函数创建:
int pipe(int filedis[2]);
当一个管道建立时,它会创建两个文件描述符:filedis[0] 用于读管道, filedis[1] 用于写管道
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[50];
char * p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
if (pipe(pipe_fd) < 0)
{
perror("pipe error :");
exit(-1);
}
if ((pid = fork()) == 0)
{
close(pipe_fd[1]);
sleep(2);
if ((r_num = read(pipe_fd[0],buf_r,50)) > 0)
{
char * p = buf_r;
while(*p != '\0')
{
if(*p >= 'a' && *p <= 'z')
{
*p = *p - 32;
}
p++;
}
printf("\n%d numbers read from the pipe, is %s \n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
else if(pid > 0)
{
close(pipe_fd[0]);
if(write(pipe_fd[1],"HeLlo",5) != -1)
{
printf("parent write pipe success!\n");
}
}
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
return 0;
}
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int pipefd[2];
int ret;
pid_t pid;
char buffer[512] = {0};
ret = pipe(pipefd);
if (-1 == ret)
{
perror("pipe");
return -1;
}
pid = fork();
switch (pid)
{
case -1:
perror("fork");
return -1;
case 0:
close(pipefd[1]);
read(pipefd[0], buffer, sizeof(buffer));
printf("Read from pipe: %s", buffer);
exit(0);
default:
close(pipefd[0]);
sleep(2);
write(pipefd[1], "Hello Linux\n", strlen("Hello Linux\n"));
}
wait(NULL);
return 0;
}