这是我正在研究的学校项目。
我正在写一个Web服务器。如果请求的资源具有扩展名'cgi',我需要fork和exec该程序。如果cgi是已编译的可执行文件,则可以:
execl(path, (char*) 0);
但是如果cgi程序是需要解释的脚本,我需要做这样的事情:
execl("/bin/sh", path, path, (char*) 0);
如何编写代码以便处理任何一种情况?我的shell是如何做到这一点的?我应该使用file
程序来确定它是可执行文件还是文本,如果它是文本,那么假设它需要被解释?
答案 0 :(得分:8)
如果是脚本,为什么需要明确调用"/bin/sh"
?
只要脚本具有执行权限并且顶部有正确的shebang,您就应该能够执行它,就好像它是可执行文件一样。
答案 1 :(得分:0)
您可以要求shell使用-c
选项为您运行命令。
如果命令是shell内置的,或shell脚本,shell将运行它;如果是外部命令,shell将执行二进制文件。
试试这个,看看它是否适合你:
execl("/bin/sh", "/bin/sh", "-c", path, (char*) 0);
编辑:纠正了上述电话。这应该现在起作用;我用进行了测试
execl("/bin/sh", "/bin/sh", "-c", "set", NULL);
我的测试程序回显了默认的shell变量。然后我用
测试了execl("/bin/sh", "/bin/sh", "-c", "/usr/bin/clear", NULL);
我的测试程序清除了终端模拟器的屏幕。
注意:关于这个答案的好处是它将运行你可以从shell运行的任何东西。因此,它将运行内置的shell命令,并且它将运行没有正确的#!/path/to/interpreter
第一行的shell脚本。如果您想要运行的所有shell脚本都具有正确的#!
第一行,则不需要此。这提供了一个稍微强大的解决方案,代价是执行可能不需要的shell。
答案 2 :(得分:0)
如果没有警告您的用户,您应该检查该文件是否具有exec权限。 您可以使用GlibC的lstat函数来执行该操作。 然后使用来自GlibC的execve为它提供路径和参数列表(你也可以从main获取env var,我建议你给你的程序提供环境而不是给(char *)0这是一个NULL指针)