9

我正在编写一个要在 C++ 中动态加载的库。

我想从我的代码中读取 argc 和 argv(出于调试原因),但是我无权访问 main 函数。有什么方法可以检索命令行(Windows 和 Linux 解决方案都很好)。

谢谢,丹

4

10 回答 10

12

在 Linux 上,伪文件 /proc/self/cmdline 包含进程的命令行。每个参数都以 0 字节结束,最后一个参数后跟一个额外的 0 字节。

于 2008-10-02T00:05:01.353 回答
11

Win32 API 中有 GetCommandLine() 函数。在其他平台上,您必须将 argc/argv 保存在某个地方(外部变量?)。

于 2008-10-01T23:58:27.390 回答
6

在 Windows 上,您可以通过 __argc 和 __argv 访问 argc/argv。__wargv 如果你想要宽字符版本。

于 2008-10-02T02:07:47.860 回答
5

该线程显示了如何在 Linux 上执行此操作。

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.system/2005-07/0147.html

于 2008-10-02T00:14:00.550 回答
4

我可以建议这听起来像一个奇怪的情况。你是在写插件还是什么?也许您不应该访问 argv/argc?

于 2008-10-02T00:16:32.590 回答
4

在 Windows 中,您可以使用GetCommandLine()获取指向命令行的指针,然后使用CommandLineToArgvW()将该指针转换为 argv[] 格式。不过,只有一个广泛的 (Unicode) 版本可用。

于 2008-10-02T00:47:09.567 回答
1

在 Windows 上,我使用这种类型的东西来获取参数:


#include <windows.h>
#include <string>
#include <vector>
#include <cwchar>
#include <cstdio>
#include <clocale>
using namespace std;

vector<wstring> getArgs() {
    int argc;
    wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    vector<wstring> args;
    if (argv) {
        args.assign(argv, argv + argc);
        LocalFree(argv);
    }
    return args;
}

int main() {
    const vector<wstring> argv = getArgs();
    setlocale(LC_CTYPE, ".OCP");
    for (vector<wstring>::const_iterator i = argv.begin(); i != argv.end(); ++i) {
        wprintf(L"%s\n", i->c_str());
    }
}

编辑:像这样的 getArgs 函数对 mingw 也很有用,因为 mingw 不支持 wmain()。

于 2008-10-02T02:32:11.453 回答
1

这应该在linux下工作:

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

void findargs(int *argc, char ***argv) {
    size_t i;
    char **p = &__environ[-2];
    for (i = 1; i != *(size_t*)(p-1); i++) {
        p--;
    }
    *argc = (int)i;
    *argv = p;
}

int main(int argc, char **argv) {
    printf("got argc=%d, argv=%p\n", argc, argv);
    findargs(&argc, &argv);
    printf("found argc=%d, argv=%p\n", argc, argv);
    return 0;
}

注意:如果 setenv() 已被调用,则失败。

于 2012-12-20T22:47:41.263 回答
0

使用 getpid() 和 ps 命令。

国际PID;

诠释 fd;

字符 cmd[80];

pid = getpid();

sprintf(cmd, "ps %d", pid);

fd = popen(cmd, "r");

....线条应该像

.... 1358 ./a.out abc def

于 2008-10-02T01:11:54.360 回答
0

您是否考虑过使用环境变量而不是命令行?根据库将用于哪种应用程序,用户可能会更容易,您可以使用标准的 getenv() 函数。

我认为,无论如何,如果您的库要使用 argc 和 argv,则程序应该是传递它们的程序。

于 2008-10-02T02:42:06.390 回答