管道
无名管道可以用来给父进程以及子进程之间通信,使用十分方便。
函数
//pipe创建管道,fd为一个int类型数组,fd[0]用来读,fd[1]用来写
pipe(fd);
//将字符串buf写入管道fd,成功则返回0,否则返回-1
write(fd[1], buf, strlen(buf));
//将管道fd的数据读出到buf,成功则返回0,否则返回-1
read(fd[0], buf, sizeof(buf));
//关闭端口,fd关闭管道,fd[0]读端口,fd[1]写端口
close(fd[]);
举例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int fd[2];
int ret;
pid_t pid;
ret = pipe(fd); //创建管道
if (-1 == ret)
{
perror("pipe");
exit(1);
}
pid = fork();
if(pid == -1)
{
perror("fork");
exit(1);
}
else if(pid == 0) //父进程
{
char readBuf[32] = {0};
close(fd[1]);//关闭写管道
ret = read(fd[0],readBuf,sizeof(readBuf));
if(ret == -1)
{
perror("read");
exit(1);
}
printf("read from the child : %s \r\n",readBuf);
close(fd[0]);//关闭读管道
}
else //子进程
{
char writeBuf[32] = {0};
close(fd[0]); //关闭读管道
strcpy(writeBuf, "Hello this is a text");
ret = write(fd[1],writeBuf,strlen(writeBuf));
if(ret == -1)
{
perror("write");
exit(1);
}
close(fd[1]);//关闭写管道
int status;
wait(&status);
}
return 0;
}
注意
使用管道时,记得将不用的管道进行close()关闭操作,防止读写计数不为0造成阻塞,产生程序BUG。