• 执行一个命令,将其输出截获的代码-使用无名管道


    使用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);
        }
  • 相关阅读:
    have you declared this activity in your AndroidManifest.xml?
    Android收回输入法的实现
    Android手机Home键重写
    Android屏幕点击事件重写
    拖动ListView列表时背景变黑
    AFNetworking vs ASIHTTPRequest vs MKNetworkKit
    libgif.so
    android.support.v4.widget.DrawerLayout
    Titanium vs PhoneGap
    Non-constant Fields in Case Labels
  • 原文地址:https://www.cnblogs.com/super119/p/2005617.html
Copyright © 2020-2023  润新知