当前位置:  技术问答>linux和unix

UNIX下利用管道重定向实现对程序的输出进行操作

    来源: 互联网  发布时间:2016-03-14

    本文导语:  如题,在WINDOWS下可能好点,但在UNIX下我就不知如何实现了,请各位高人帮一下忙,能给思路已经很感激了,如果有源代码将更好.我先谢过大家了. | 用pipe 和 dup2.  man 2 pipe dup2 #include  #include  #...

如题,在WINDOWS下可能好点,但在UNIX下我就不知如何实现了,请各位高人帮一下忙,能给思路已经很感激了,如果有源代码将更好.我先谢过大家了.

|
用pipe 和 dup2.  man 2 pipe dup2

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
        int pfd[2];
        pid_t cpid;
        char buf;

        assert(argc == 2);

        if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); }

        cpid = fork();
        if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); }

        if (cpid == 0) {    /* Child reads from pipe */
                close(pfd[1]);          /* Close unused write end */
                if (dup2(pfd[0], STDIN_FILENO) == -1) {
                        perror("dup2");
                        exit(EXIT_FAILURE);
                }

                while (read(STDIN_FILENO, &buf, 1) > 0)
                        write(STDOUT_FILENO, &buf, 1);

                close(STDIN_FILENO);
                close(pfd[0]);
                _exit(EXIT_SUCCESS);

        } else {            /* Parent writes argv[1] to pipe */
                close(pfd[0]);          /* Close unused read end */
                if (dup2(pfd[1], STDOUT_FILENO) == -1) {
                        perror("dup2");
                        exit(EXIT_FAILURE);
                }
                printf("%sn", argv[1]);
                fflush(stdout);
                close(STDOUT_FILENO);
                close(pfd[1]);          /* Reader will see EOF */
                wait(NULL);             /* Wait for child */
                exit(EXIT_SUCCESS);
        }
}

|
如果是要在你的程序里执行其他程序,直接用popen也挺方便的
stream=popen("ps -ef|grep mplayer","r");
if(stream!=NULL)
{
        memset(buff,0,sizeof(buff));
        while(fgets(buff,512,stream))
        {
                p=strtok(buff," ");
                if(p==NULL)break ;
                if(strlen(p)==0)
                break;
                if((pidnum=atoi(p))==0)
                break;
                splaypid=(pid_t)pidnum;
                kill(splaypid,SIGKILL);
        }
        pclose(stream);
}

|
#include 
int main(int argc, char *argv[])
{
        char buf[128];
        FILE *pp;
int i=0;
        if( (pp = popen("test.sh", "r")) == NULL )
        {
                printf("popen() error!n");
                exit(1);
        }

        while(fgets(buf, sizeof buf, pp))
        {
i++;
                printf("%s", buf);
        }
        pclose(pp);
        return 0;
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁知道linux/unix下利用Schema读取校验xml的开源代码,给一个链接,谢谢!
  • 请问怎么利用sco unix 5.05中的磁盘分区工具进行硬盘分区
  • 请问在SCO UNIX 5.0.5里如何察看CPU与内存等资源的利用率?谢谢!
  • 如何编程获取HP-UNIX 磁盘IO利用率,磁盘I/O所占用的时间,
  • 哪位有java通信方面的经验,谈谈如何利用java编写服务器程序来接受unix主机发送的数据信息?
  • unix下如何利用core文件找到产生它的具体程序及产生错误的代码位置
  • 在UNIX中如何通过程序获得主机的资源使用状况,CPU利用率等。
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!
  • UNIX支持中文否,请推荐UNIX好书
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX
  • 散分!!unix 用户调查!!!你使用哪款unix
  • hp unix 和 sco unix的区别
  • 入门问题,我想向UNIX编程方向发展,单目前不会UNIX,我该如何做
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 现在那些unix比较流行?Linux和 Unix有 什么区别?
  • 小问题, Unix 如何建立一个文件 ,unix 文件有后缀名吗
  • 我想学习Unix,请高手给个下载网址,用linux来学习Unix差别大吗?
  • 请问各位unix大虾,哪有免费的unix下载?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3