博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux 编程使用管道来控制 shell
阅读量:6288 次
发布时间:2019-06-22

本文共 1476 字,大约阅读时间需要 4 分钟。

hot3.png

  这个程序的作用就是 前台输入的 数据通过管道传递给后台的 sh 进程 然后将执行的结果返回到前台  

   linux 的管道使用要注意  一个管道 只能一端读 一端 写  当创建完子进程后   父进程和子进程都需要关闭管道的一端  因为 没必要自己写 自己读  此处  需要使用两个管道 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
int read_pipe[2];int write_pipe[2];void MyCreateThread(void *(*func)(void *),void *lparam){ pthread_attr_t attr; pthread_t p; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&p,&attr,func,lparam); pthread_attr_destroy(&attr);}void *read_thread(void *lparam){ char cmd[100]; int bytes = 0; while((bytes = read(STDIN_FILENO,cmd,100)) > 0) { write(write_pipe[1],cmd,bytes); } return NULL;}int main(int argc, char *argv[]){ int pid; pipe(read_pipe); pipe(write_pipe); pid = fork(); if(0 == pid) { //进入子进程 // 启动 shell 进程 close(read_pipe[0]); close(write_pipe[1]); char *argv[] = {"/bin/sh",NULL}; char *shell = "/bin/sh"; dup2(write_pipe[0],STDIN_FILENO); //将输入输出重定向到管道 dup2(read_pipe[1],STDOUT_FILENO); dup2(read_pipe[1],STDERR_FILENO); execv(shell,argv); } else { char buff; close(read_pipe[1]); close(write_pipe[0]); printf("child process id %d \n",pid); write(write_pipe[1],"ls\n",3); //启动一个线程来读取 MyCreateThread(read_thread,NULL); while(read(read_pipe[0],&buff,1) > 0) { putchar(buff); } waitpid(pid,NULL,0); printf("child exit. ..\n"); } return 0;}

转载于:https://my.oschina.net/sincoder/blog/123465

你可能感兴趣的文章
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>