Linux:管道使用注意事项
创始人
2024-06-03 10:33:33
0

1.管道创建后父进程和子进程都拿到了管道的读写端描述符。各个进程根据所需关闭端口。
在这里插入图片描述
2.不同的读写端关闭情况,会产生不同的读写结果。
在这里插入图片描述

3.测试代码:
#include
#include
#include
#include

#if 0
int main(int * argc, const char * agrv[])
{
int fd[2];
pipe(fd);
pid_t pid = fork();
// while(1)
// {
if(pid == 0)//子进程
{
//close(fd[0]);//子进程写pipe,关闭读端
//dup2(STDOUT_FILENO,fd[1]);
dup2(fd[1],STDOUT_FILENO);//ps命令输出到标准输出设备,需要重定向到pipe的写端
execlp(“ps”,“ps”,“aux”,NULL);
}
else if(pid > 0) //父进程
{
//close(fd[1]);//父进程读pipe,关闭写端
//dup2(STDIN_FILENO,fd[0]);
dup2(fd[0],STDIN_FILENO);//grep命令从标准输入接收数据,现在需要从pipe的读端读数据,所有需要把标准输入重定向到pipe的读端p[0]
execlp(“grep”,“grep”,“bash”,NULL);
}

// }
return 0;

}
#endif

#if 0
int main(int * argc, const char * agrv[])
{
pid_t pid;
int fd[2];
pipe(fd);
int i;
for(i = 0; i<2; i++)
{
pid = fork();

    if(pid == 0) break;
}
if(pid > 0) //父进程
{printf("I am father, pid:%d\n",getpid());close(fd[0]);close(fd[1]);// int status;// while(1) {//     sleep(1);//     int ret =  waitpid(-1,&status,WNOHANG);//     //int ret =  wait(&status);//     if(WIFEXITED(status)) printf("recycle child , status:%d\n", WEXITSTATUS(status));//     if(WIFSIGNALED(status)) printf("recycle child , with status:%d\n", WTERMSIG(status));// }
}
else if( pid == 0)
{   if(i == 0)//子进程1{sleep(1);//保证父进程先执行printf("I am child1, pid:%d\n",getpid());close(fd[0]);//子进程写pipe,关闭读端//dup2(STDOUT_FILENO,fd[1]);dup2(fd[1],STDOUT_FILENO);//ps命令输出到标准输出设备,需要重定向到pipe的写端execlp("ps","ps","aux",NULL);close(fd[1]);exit(1);}        else if(i == 1) //子进程2{sleep(2);//保证父进程和子进程1先执行printf("I am child2, pid:%d\n",getpid());close(fd[1]);//子进程2读pipe,关闭写端//dup2(STDIN_FILENO,fd[0]);dup2(fd[0],STDIN_FILENO);//grep命令从标准输入接收数据,现在需要从pipe的读端读数据,所有需要把标准输入重定向到pipe的读端p[0]execlp("grep","grep","bash",NULL);close(fd[0]);exit(1);} 
}return 0;

}
#endif

int main(int * argc, const char * argv[])
{
int fd[2];//
pipe(fd);

pid_t pid = fork();if(pid == 0)
{sleep(1);close(fd[0]);//先关闭读端char buf[] = {"hello world"};close(fd[1]);//管道写端也关闭//write(fd[1],buf,sizeof(buf));//close(fd[1]);//子进程关闭写端while(1){write(fd[1],buf,sizeof(buf));perror("write pipe:");sleep(1);}
}
else if(pid > 0) //父进程读管道
{sleep(2);close(fd[1]);//父进程关闭写端//close(fd[0]);char buf[20];int status;while(1) {int ret = read(fd[0],buf,5);//读管道//printf("read data %s, ret = %d\n",buf, ret);sleep(1);int wret =  waitpid(-1,&status,WNOHANG);//int wret =  wait(&status);if(WIFEXITED(status)) printf("recycle child , status:%d\n", WEXITSTATUS(status));if(WIFSIGNALED(status)) printf("recycle child , with status:%d\n", WTERMSIG(status));}        
}

}

相关内容

热门资讯

玩家终于实锤了!哈哈长沙麻将有... 玩家终于实锤了!哈哈长沙麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的...
玩家终于实锤了!毛豆娱乐有挂吗... 您好:毛豆娱乐确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这款...
玩家终于实锤了!星禾游戏有挂吗... 您好:星禾游戏确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这款...
玩家终于实锤了!乐太坊有挂吗(... 你好乐太坊这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】, ...
玩家终于实锤了!桦南麻将有挂吗... 玩家终于实锤了!桦南麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)1、让任何用户在无需AI...
玩家终于实锤了!聚友联盟有挂吗... 自定义聚友联盟系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!哈狗游戏有挂吗... 自定义哈狗游戏系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!熊猫四川麻将有... 玩家终于实锤了!熊猫四川麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的...
玩家终于实锤了!红龙扑克有挂吗... 玩家终于实锤了!红龙扑克有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家...
玩家终于实锤了!边锋陕西麻将有... 您好:边锋陕西麻将确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在...
玩家终于实锤了!阿拉斗牌有挂吗... 玩家终于实锤了!阿拉斗牌有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、阿拉斗牌AI软件牌型...
玩家终于实锤了!潇湘游有挂吗(... 玩家终于实锤了!潇湘游有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家,...
玩家终于实锤了!PG娱乐城有挂... 玩家终于实锤了!PG娱乐城有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、PG娱乐城AI软件...
玩家终于实锤了!一点山西麻将有... 玩家终于实锤了!一点山西麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)1、让任何用户在无需...
玩家终于实锤了!友约山西麻将有... 玩家终于实锤了!友约山西麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、友约山西麻将AI...
玩家终于实锤了!花城牌舍有挂吗... 自定义花城牌舍系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!闲趣有挂吗(分... 亲,闲趣这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,闲趣的开挂软件,名称叫闲趣...
玩家终于实锤了!乐悠空间有挂吗... 您好,乐悠空间这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785}...
玩家终于实锤了!青藤鼎趣麻将有... 玩家终于实锤了!青藤鼎趣麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、青藤鼎趣麻将AI...
玩家终于实锤了!微乐浙江麻将有... 你好微乐浙江麻将这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785...