程序分身:根据不同程序名执行不同函数

版权声明:本文为迟思堂主人李迟原创文章,版权所有。可随便任意使用(包括学习研究商用),但由此带来的成果或后果,概与作者无关。胡乱修改的,不注明出处的,概不负责。 https://blog.csdn.net/subfate/article/details/81212751

背景

最近在看某开源项目源码,发现代码里对main函数的参数做了处理,根据传入的程序名称(即argv[0]),调用不同的函数。笔者认为这个小技巧挺不错的,本文就整理实践一下。

完整源码

main.c源码如下:

/**
作用:
只有可执行程序文件名是foo或bar时才能正常执行,其它任何字符串都不行。

作用:
如有服务端、客户端的小程序,可在一个文件中实现,编译,然后改名,根据可执行文件不同,调用不同函数,达到“多程序”目的。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int foo_1(int argc, char* argv[])
{
    printf("hello foo.\n");
}

int bar_1(int argc, char* argv[])
{
    printf("hello bar.\n");
}

#define CMD_FOO "foo"
#define CMD_BAR "bar"

int main(int argc, char *argv[])
{
    char* p;
    char* cmdname = *argv;

    if ((p = strrchr (cmdname, '/')) != NULL) {
        cmdname = p + 1;
    }

    if (strcmp(cmdname, CMD_FOO) == 0) {

        if (foo_1 (argc, argv) != 0)
            return -1;

        return 0;

    } else if (strcmp(cmdname, CMD_BAR) == 0) {

        if (bar_1 (argc, argv) != 0)
            return -1;

        return 0;

    }

    fprintf (stderr,
        "Identity crisis - may be called as `" CMD_FOO
        "' or as `" CMD_BAR "' but not as `%s'\n",
        cmdname);
    return -1;
}

编译

gcc main.c

执行:

$ ./a.out 
Identity crisis - may be called as `foo' or as `bar' but not as `a.out'
$ cp a.out foo
$ cp a.out bar
$ ./foo 
hello foo.
$ ./bar 
hello bar.

实践应用、小结

在socket测试中,有客户端、服务端代码,可分别在不同文件中实现,但只有一个入口main函数,只用一个Makefile,在Makefile中将生成的可执行文件改名为client、server,然后就得到2个程序了。这样就不需要维护2个Makefile,编译2次了。从效率上看,还是可以试试。

本文所述的,只是小技巧,对于大型项目来说,不能这样做。但其思想,还是值得我们学习的。

李迟 2017.7.25 凌晨

猜你喜欢

转载自blog.csdn.net/subfate/article/details/81212751
今日推荐