c语言 - 使用'execlp'系统调用以递归方式运行当前程序



我试图使用execlp在程序内部调用程序(对于项目(,但遇到了问题。我创建了一个示例项目,它应该从n倒计时到0(基本上运行n次(。每次运行它时,我都会得到第一个减量,然后我会得到一个seg错误。请让我知道我在这里做错了什么。

p.S对C中的系统调用相当陌生,所以如果可能的话,请彻底解释。提前感谢!

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
#include <time.h>
int main(int argc, char **argv)
{
int n = atoi(argv[1]);
char newParameters[2];
sprintf(newParameters, "%d", n - 1);
if (n != 0)
{
execlp("./tmp", newParameters, (char *)NULL);
}
printf("The program has finished.n");
return 0;
}

C程序称为tmp。

来自execlp手册:

这些函数的初始参数是要执行的文件的名称。

execl((、execlp((和execle((函数中的const char*arg和后续省略号可以被认为是arg0、arg1、…、。。。,argn。它们一起描述了一个或多个指向空终止字符串的指针的列表,这些指针表示可用于执行程序的参数列表。按照惯例,第一个参数应该指向与正在执行的文件相关联的文件名。

也就是说,execlp的第一个参数是要运行的可执行文件。第二个参数对应于传递给mainargv[0]。第三个参数是argv[1],依此类推。因此,这种情况下的execlp需要为:

execlp("./tmp", "./tmp", newParameters, NULL);

或者最好还是使用argv[0],而不是硬编码的可执行文件名,这样无论程序如何链接,它都可以工作:

execlp(argv[0], argv[0], newParameters, NULL);

其他需要注意的事项:

  • newParameters只能容纳单个字符串(包括NUL终止符(。因此,任何数字大于9的命令行都会导致未定义的行为
  • 其他良好做法:在使用argv值之前,始终检查argc,并始终检查所有函数调用的返回值,在这种情况下尤其是execlp

execlp(2)不能用于递归运行程序,因为不会创建新进程。当前上下文(进程地址空间、数据等(用新映射加载(覆盖(以再次执行同一程序,数据段、堆栈和内存段被分离并丢弃以创建新的程序。当这个实例最终exit(2)s时,没有可备份的进程。要创建新进程,需要使用fork(2),而不是execlp(2)

相关内容

最新更新