我最近在一个演讲中,其中一位发言者声称他使用了一个用C语言编写的CGI文件,该文件由网络服务器调用,但是网络服务器使用不同的名称调用该文件, CGI文件将运行不同的方法。
如何通过不同的名称调用单个C文件执行不同的函数?另外,如何将对不同命名文件的调用重定向回此单个文件?
这可能还是他只是满满的自己?
答案 0 :(得分:1)
如果使用不同的名称创建可执行文件但具有相同的代码库,则可以根据用于调用程序的可执行文件的名称来获取代码的不同分支。
简单示例文件:
#include <stdio.h>
#include <string.h>
int main1(int argc, char** argv)
{
printf("Came to main1.\n");
return 0;
}
int main2(int argc, char** argv)
{
printf("Came to main2.\n");
return 0;
}
int main(int argc, char** argv)
{
// If the program was invoked using main1, go to main1
if (strstr(argv[0], "main1") != NULL )
{
return main1(argc-1, argv+1);
}
// If the program was invoked using main2, go to main2
if (strstr(argv[0], "main2") != NULL )
{
return main2(argc-1, argv+1);
}
// Don't know what to do.
return -1;
}
从文件中创建两个不同的可执行文件。
cc test-262.c -o main1
cc test-262.c -o main2
然后,使用两个不同的可执行文件调用该程序:
./main1
输出:
Came to main1.
和...
./main2
输出:
Came to main2.
答案 1 :(得分:0)
Unix文件系统支持硬链接和软链接的概念。要创建它们,只需输入:
ln origfile newfile
创建硬链接,或者:
ln -s origfile newfile
创建一个软链接。
软链接只是一种包含另一个文件路径的特殊文件。链接中的大多数操作都透明地导致对目标文件进行操作。
硬链接较低。实际上,所有文件都是从路径名到内容的链接。在Unix中,您可以将多个路径名链接到相同的内容。实际上,没有&#34;原始&#34;和&#34;链接&#34;,都是链接。删除文件时,您只需删除链接,当链接数为零时,内容将被删除。
许多unix实用程序都会这样做。由于正在运行的shell包含用于调用可执行文件的名称,因此它的处理方式与命令行的第0个参数类似。
答案 2 :(得分:0)
这是可能的,实际上很常见。
传递给argv
函数的main
数组中的第一个元素是可执行文件的“名称”。这可以是完整路径,也可以只是路径的最后一个组件,或者 - 如果可执行文件以exec*
函数调用启动,则它可以是任意字符串。 (并且Posix允许它也是一个空字符串,但在实践中这是非常罕见的。)
所以没有什么可以阻止可执行文件查看argv[0]
(首先检查以确保argc > 0
)并解析它。
为可执行文件引入不同名称的最典型方法是插入具有备用名称的文件系统链接(可以是硬链接或软链接,但对于可维护性,软链接更有用。)
对于CGI,甚至不需要检查argv[0]
,因为有各种有用的环境变量,包括(至少):SCRIPT_NAME
。
答案 3 :(得分:0)
当Web服务器调用CGI脚本时,它会在其环境中收到大量信息,以便让它知道如何调用它,包括:
SCRIPT_NAME
,文档根目录SCRIPT_FILENAME
,脚本的文件系统路径(通常与argv[0]
相同)REQUEST_URI
,浏览器请求的路径(在没有重写URL时通常类似于SCRIPT_NAME
)QUERY_STRING
和PATH_INFO
,其中包含脚本名称后面的网址参数HTTP_*
,其中包含请求中传递的大多数HTTP标头重点是,脚本获取有关如何调用它的大量信息。可以使用其中任何一个来做出决定。