zoukankan      html  css  js  c++  java
  • 执行一个命令,将其输出截获的代码-使用无名管道

    使用popen库函数的版本:


        #include <unistd.h>
        #include 
    <stdio.h>
        #include 
    <stdlib.h>
        #include 
    <fcntl.h>
        #include 
    <limits.h>

        
    #define BUFSZ PIPE_BUF

        
    void err_quit(char *msg);

        
    int main(int argc, char *argv[])
        {
            FILE 
    *fp;  // FILE stream for popen
            char *cmdstring = "ps -aux|grep root";
            
    char buf[BUFSZ];

            
    // create the pipe
            if ((fp = popen(cmdstring, "r")) == NULL)
                err_quit(
    "popen");

            
    // read the cmdstring's output
            while ((fgets(buf, BUFSZ, fp)) != NULL)
                printf(
    "%s", buf);

            
    // close and frap the exit status
            pclose(fp);
            exit(EXIT_SUCCESS);
        }

        
    void err_quit(char *msg)
        {
            perror(msg);
            exit(EXIT_FAILURE);
        }

    不使用库函数,自己实现的版本(先fork,然后修改子进程的STDOUT文件描述符为管道,然后再exec),这个思路来自Linux Shells by Examples一书,因为BASH执行命令就是酱紫的:

        #include <unistd.h>
        #include 
    <sys/types.h>
        #include 
    <sys/wait.h>
        #include 
    <stdio.h>
        #include 
    <stdlib.h>
        #include 
    <fcntl.h>
        #include 
    <limits.h>

        
    #define BUFSZ PIPE_BUF

        
    void err_quit(char *msg);

        
    int main(int argc, char *argv[])
        {
            
    int fd[2]; // File descriptor array for the pipe
            char buf[BUFSZ];
            
    char *cmdstring[] = {"/bin/ps""-aux", NULL};
            
    int pid, len;

            
    // create the pipe
            if ((pipe(fd)) < 0)
                err_quit(
    "pipe");

            
    // fork and close the appropriate descriptors
            if ((pid = fork()) < 0)
                err_quit(
    "fork");
            
    if (pid == 0) {
                
    // child will invoke the cmdstring, so close stdout, dup pipewriter
                close(STDOUT_FILENO);
                dup(fd[
    1]);
                close(fd[
    0]);
                
    // invoke the cmdstring
                if (execve(cmdstring[0], cmdstring, NULL) == -1)
                    err_quit(
    "execve");
            } 
    else {
                
    // parent process
                close(fd[1]);

                
    while ((len = read(fd[0], buf, BUFSZ)) > 0)
                    printf(
    "%s", buf);
                close(fd[
    0]);

                waitpid(pid, NULL, 
    0);

                exit(EXIT_SUCCESS);
            }
        }

        
    void err_quit(char *msg)
        {
            perror(msg);
            exit(EXIT_FAILURE);
        }
  • 相关阅读:
    Springboot+mybatis-plus+mysql+clickhouse集成多数据源
    对集合里每个元素是一个对象,按照对象某一个属性值给这个集合排序
    vue的a-tree-select选择父节点回显的是子节点
    Es简单条件查询
    使用Ant Desigen在vue里面实现分页以及表头的模糊查询
    搭建第一个vue项目
    Address localhost:1099 is already in use
    spring的控制反转DI---基于注解实现
    mybatis下的ResultMap配置一对一以及一对多
    mybatis入门
  • 原文地址:https://www.cnblogs.com/super119/p/2005617.html
Copyright © 2011-2022 走看看