如何在Linux中编写完全透明的C / C ++包装程序

时间:2019-04-27 10:02:22

标签: c linux

注意:这不是要求程序的问题,它询问一些技术细节,请首先参见以下问题。

我需要为现有程序编写C / C ++包装程序。我知道我们需要使用exec / fork / system并传递参数,然后返回程序的结果。

问题是,如何确保调用程序(调用包装程序)和包装程序都完全像以前一样工作(忽略时序差异)。可能需要处理一些细微的事情,例如环境参数。 fork / system / exec,使用哪个?他们够了吗?还有其他因素要考虑吗?

1 个答案:

答案 0 :(得分:2)

假设您有以下原始程序:

foo.sh

#!/bin/bash
echo "Called with: ${@}"
exit 23

使其可执行:

$ chmod +x foo.sh

现在将包装器放入C

wrapper.c

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>


int main(int argc, char* argv[]) {
    printf("Executing wrapper code\n");

    /* do something ... */

    printf("Executing original program\n");
    if(execv("./foo.sh", argv) == -1) {
        printf("Failed to execute original program: %s\n", strerror(errno));
        return -1; 
    }   
}

运行它:

$ gcc wrapper.c
$ ./a.out --foo -b "ar"
Executing wrapper code
Executing original program
Called with: --foo -b ar
$ echo $?
23