【发布时间】:2010-09-25 05:12:13
【问题描述】:
我正在用我的语法,在 LEX 中编写一些代码来 fork() 我的进程并运行一个子进程。孩子实际上是从父母那里得到一些输入,然后返回一个结果。
我需要在加载父级的同一个二进制文件上调用 exec,但我遇到了问题。我知道 exec 并不意味着完全有意义,但我这样做是因为我在 LEX 中有一些以前的语法,我只是想摆脱它,因此重新加载过程更容易。
在 fork() 之后,我在孩子中有以下代码:
char *path = strdup(getenv("PWD"));
size_t size = strlen(path) + strlen("/shell") + 1;
path = (char *) realloc(path, sizeof(char) * size);
path = strcat(path, "/shell");
// call exec
execl(path, NULL);
此代码的问题在于,如果进程从同一目录启动,它可以工作,但如果我尝试从该目录中的文件夹加载,例如 ../shell,那么路径实际上是错误的,它将包含此目录。
我想知道如何获得进程的正确路径,如果有办法也可以获得进程的实际名称吗?我查看了环境变量,但没有发现任何有用的东西。
非常感谢,
杰瑞
【问题讨论】:
-
请注意,您显示的对
execl()的调用不会为被调用程序提供argv[0](或者,更准确地说,它将空指针提供为argv[0]- 如果NULL 定义为@ 987654325@; 否则它给出一个零整数,这在 64 位机器上可能不够大)。为了安全起见,您应该使用execl(path, path, (char *)NULL);。