代码之家  ›  专栏  ›  技术社区  ›  Arkaitz Jimenez

应用程序中的嵌入式控制台工具功能

  •  0
  • Arkaitz Jimenez  · 技术社区  · 16 年前

    我目前正在开发一个应用程序,在实际读取数据之前需要进行一些文件预处理。

    从外部进行是不可能的,所以我想出了一个分叉&execve“剪切选项文件名排序uniq-c”等…我就是这样执行的。

    然而,我认为也许已经有了另一种选择,可以直接在我的代码中重用所有那些古老的、好的工作工具,而不必通过shell来调用它们。

    我目前正在研究busybox,看看是否有一种简单的静态链接方法,并通过编程调用这些实用程序,但还没有运气。

    8 回复  |  直到 16 年前
        1
  •  4
  •   pbr    16 年前

    阿卡茨,答案是不,因为你是怎么回答这个问题的。

    您要求“另一种选择是直接在我的代码中重用所有那些古老的、好的工作工具,而不必通过shell调用它们。”

    问题是,正确和被接受的重用所有这些古老和良好的工作工具的方法正是您想要避免的——通过shell调用它们(或者至少,通过popen将它们作为子进程激发起来),并且绝对不建议尝试将这些工具包含、复制或复制到您的代码。

    用于数据操作的Unix(和Linux)模型是可靠且经过验证的——为什么要避免它?

        2
  •  3
  •   xtofl Adam Rosenfield    16 年前

    “古老的”工具是为shell使用而构建的,而不是构建/链接到可执行文件中。不过,还有一些最新的工具可以完成命令行预处理器上显示的许多工作:使用提取器的iostreams(替换 cut ) std::sort std::unique 替换相应的程序…

    struct S { string col1, col3; 
       bool operator<( const S& s ) { return col1 < s.col1; }
    };
    vector<S> v;
    while( cin ) {
      S s;
      string dummy;
      cin >> s.col1 >> dummy >> col3 >> dummy;
      v.push_back( s );
    }
    sort(v.begin(), v.end(), S::smaller );
    unique( v.begin(), v.end() );
    

    我想不太复杂。

        3
  •  2
  •   Community Mohan Dere    9 年前

    尝试PONEN()。

    char buffer [ BUFFER_SIZE ];
    FILE * f = popen( "cut options filename | sort | uniq -c", "r" );
    while( /*NOT*/! feof(f) )
      fgets( buffer, BUFFER_SIZE, f );
    pclose( f );
    

    参考文献: How to execute a command and get output of command within C++ using POSIX?

        4
  •  1
  •   Elalfer    16 年前

    你必须通过外壳来完成,但是使用“系统”调用更容易。

    while(something) {
               int ret = system("foo");
    
               if (WIFSIGNALED(ret) &&
                   (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                       break;
           }
    
        5
  •  1
  •   Elalfer    16 年前

    只需编写另一个有用的“古老而好的”工具;)并从stdin读取所有数据并将其返回到stdout。

    cat *.txt | grep 'blabla' | sort | my_new_tool | tee -o res_file

        6
  •  1
  •   Elalfer    16 年前

    最好的方法是:

    • 创建2个管道
    • 分叉一个新过程
    • 更换 stdin stdout 对于带有管道的子进程,使用 dup2 功能
    • exec 你想要的命令
    • 使用管道从父进程写入和读取
        7
  •  0
  •   Dennis Williamson    16 年前

    busybox也是我的第一个想法,尽管您可能还想考虑嵌入类似于python的脚本引擎,并在python脚本中执行这些操作。

    我绝对不会尝试将这种功能从GNU命令行工具中剥离出来,因为它们自早期的Unix时代起就有了显著的增长,并且产生了大量的选项。

    如果busybox代码看起来太难适应,那么下一个我要找的地方就是 Minix source code . 在以前的版本下,选择一个版本1或2的小型版本,因为它们是作为教学代码编写的,所以它们往往更清晰和简单。

        8
  •  0
  •   Graham Toal    16 年前

    如果不想调用外部命令(无论是由exec、popen还是system等),但不想修改这些实用程序的源代码并将它们编译到代码中(相对简单,只需将“main”更改为“main”等),那么我看到的唯一剩下的选项是将实用程序嵌入到代码中,并在运行时或dy时提取它们。通过指向代码中的数据(例如使用软盘或CD映像并编写从RAM地址接收磁盘映像数据的Fuse模块),动态地创建一个文件系统。所有这些看起来都是大量的工作,只是为了让它看起来像一个单独的、整洁的包装实用程序。

    就个人而言,如果我真的必须这样做,我会得到所有这些实用程序的源代码,并将它们编译为外部调用。当然,您将不再有易于使用的管道,您要么必须使用临时文件进行预处理,要么使用一些更复杂的涉及共同例程的东西。或者是插座。不管你做什么,都会有大量的工作和混乱!