0

我是C新手。我的最终目标是创建一个 Apache 模块,将 Apache 用户帐户的 crontab 作为 JSON 返回。

婴儿先迈出第一步。我已经成功地按照以下两个位置的教程从 Apache 模块输出“hello world”及其变体(实际上我拥有 Nick Kew 的书):

我稍微修改了示例以输出 JSON,如下所示:

ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r);

我想替换“?” 上面是Linux系统的'whoami'命令的输出(最终我想运行linux命令'crontab -lu username')。作为一个 C 新手,虽然我对如何去做这件事的选择感到不知所措,但我已经尝试了一些事情,但似乎并没有接近正确。我似乎确实能够捕获 whoami 的输出,或者至少我的代码可以编译并运行;)

FILE *sysp = popen("whoami","r");

但我什至在做上述正确的事吗?下一步是什么?我想我可能会尝试从上面确定输出的长度,然后创建一个相同长度的 char 数组,倒回文件句柄并获取输出。但我似乎没有正确获得长度,也许这是一种次优方法?当我运行以下命令时(我遗漏了几行我知道可能需要的行,即倒带,fclose),我得到的输出是-1:

fseek(sysp, 0L, SEEK_END);
long len = ftell(sysp);
char buf[2];
sprintf(buf, "%d", (int)len);
ap_rputs(buf, r);

任何关于如何更好地从系统命令“whoami”输出结果的指针将不胜感激。

4

1 回答 1

1

FILE *这种情况下,指的是一个管道,它可能不是真正可搜索的。理想情况下,您应该直接从系统中获取您要查找的信息,而不是调用外部程序;我认为getuid()andgetpwent()函数在这里会派上用场。

getpwent()可能会阻塞(就像您的方法 using 一样,popen()将您的模块与每个请求不使用至少一个线程的任何 MPM 一起使用是不安全的。

于 2011-01-27T12:17:06.447 回答