Linux 匿名管道
2016-07-24 00:11
423 查看
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int pipe_fd[2];
if (pipe(pipe_fd) < 0)//pipe函数用于创建管道,如果小于0,失败
{
perror("pipe\n");//perror打印错误信息
return 1;
}
pid_t id = fork();//创建子进程
if (id < 0)//<0表明出错返回
{
perror("fork\n");
return -1;
}
//子进程。创建子进程后,子进程返回0,父进程返回子进程id
else if (id == 0)
{
close(pipe_fd[0]);//child关闭读--向匿名管道中写入数据
const char* msg = "i am a child\n";
int count = 5;
int i = 0;
while (1)
{
write(pipe_fd[1], msg, strlen(msg));
if (count-- == 0)
break;
sleep(1);
printf("child: write data: %d\n", i++);
}
close(pipe_fd[1]);
}
else
{//父进程从匿名管道中读数据
close(pipe_fd[1]);//pipe_fd[1]为写数据--关闭写端
char buf[1024];
int count = 5;
while (1)
{
memset(buf, '\0', sizeof(buf));//每次进行初始化
ssize_t _s = read(pipe_fd[0], buf, sizeof(buf)-1);//读数据
if (_s > 0)//返回值大于0,读取成功,打印
{
printf("client ->server:%s\n", buf);
}
else if (_s == 0)//等于0,说明结束
{
printf("read pipe EOF...\n");
}
else//小于0 出错 直接退出循环
break;
}
}
close(pipe_fd[0]);
int status = 0;
pid_t ret = waitpid(id, &status, 0);//waitpid进程等待函数
if (ret == id)//ret==id 说明等待成功
{
printf("wait child sucess...\n");
printf("get sig:%d\n", status & 0xff);
printf("exit code :%d\n", (status >> 8) & 0xff);
}
return 0;
}
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{
int pipe_fd[2];
if (pipe(pipe_fd) < 0)//pipe函数用于创建管道,如果小于0,失败
{
perror("pipe\n");//perror打印错误信息
return 1;
}
pid_t id = fork();//创建子进程
if (id < 0)//<0表明出错返回
{
perror("fork\n");
return -1;
}
//子进程。创建子进程后,子进程返回0,父进程返回子进程id
else if (id == 0)
{
close(pipe_fd[0]);//child关闭读--向匿名管道中写入数据
const char* msg = "i am a child\n";
int count = 5;
int i = 0;
while (1)
{
write(pipe_fd[1], msg, strlen(msg));
if (count-- == 0)
break;
sleep(1);
printf("child: write data: %d\n", i++);
}
close(pipe_fd[1]);
}
else
{//父进程从匿名管道中读数据
close(pipe_fd[1]);//pipe_fd[1]为写数据--关闭写端
char buf[1024];
int count = 5;
while (1)
{
memset(buf, '\0', sizeof(buf));//每次进行初始化
ssize_t _s = read(pipe_fd[0], buf, sizeof(buf)-1);//读数据
if (_s > 0)//返回值大于0,读取成功,打印
{
printf("client ->server:%s\n", buf);
}
else if (_s == 0)//等于0,说明结束
{
printf("read pipe EOF...\n");
}
else//小于0 出错 直接退出循环
break;
}
}
close(pipe_fd[0]);
int status = 0;
pid_t ret = waitpid(id, &status, 0);//waitpid进程等待函数
if (ret == id)//ret==id 说明等待成功
{
printf("wait child sucess...\n");
printf("get sig:%d\n", status & 0xff);
printf("exit code :%d\n", (status >> 8) & 0xff);
}
return 0;
}
相关文章推荐
- centos6网卡ip配置
- linux文件系统
- ARCH linux 安装kde界面,libreoffice,terminal不能使用fcitx解法
- ARCH linux 终端自动补全命令
- Linux下实现进度条
- Linux线程-互斥锁pthread_mutex_t
- linux top 结果
- linux 实时观察文件行数变化
- Linux程序员必读:中文化与GB18030标准
- 如何学习 Linux
- Linux 主机规划与磁盘分区
- 李开复:21世纪最需要的7种人才
- Linux 是什么
- CentOS下设置MySQL的root密码
- linux下的几个查找命令的区别
- 如何理解ip路由和操作linux的路由表
- Linux权限管理命令
- eCryptfs v0.1 Design Document
- Linux curl简介
- 如何在 Linux 上录制你的终端操作