【发布时间】:2021-05-19 06:12:22
【问题描述】:
我很抱歉我的问题措辞不好,但我真的不知道如何更准确。我真的不明白我遇到的问题。首先,这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
int gettimeofday();
void lance_commande(char *commande)
{
int res;
float t1,t2;
t1=gettimeofday();
res=system(commande);
t2=gettimeofday();
printf("Temps écoulé : %f secondes\n",t2-t1);
if(res==-1)
{
printf("Une erreur est survenue\n");
}
}
int main(int argc, char *argv[])
{
int i;
if (argc>1)
{
for(i=1;i<argc;i++)
{
lance_commande(argv[i]);
printf("\n");
}
}
else
{
printf("Aucun argument n'a été passé en entrée");
}
return 0;
}
我的程序所做的是使用函数 lance_commande 执行一些 shell 命令,当我从 shell 启动程序时,我想要执行的命令作为参数传递,如下所示:./program "command1" "command2" ...
当我执行粘贴有参数的代码时:./program "sleep 1" "sleep 2",它输出 Segmentation Fault (core dumped)。我是 C 初学者,所以我不太明白为什么会这样,我听说内存访问有问题,但我仍然不知道如何解决。
在我的 main 函数中,在 for 循环中,当我调用 system() 函数而不是调用 lance_command 函数时,命令运行完美。
在我的 lance_command 函数中,当我调用 system(*commande) 时,我尝试使用 commande 而不是 *commande 作为参数,我收到的输出发生了变化:
sh: 1: Syntax error: EOF in backquote substitution
Segmentation fault (core dumped)
我不知道发生了什么,有人可以帮助我了解问题所在吗?对不起,如果我的问题的答案已经存在,但我不知道我应该寻找什么样的问题。
编辑:我进行了修改以删除有关 system() 函数输出的 int 到 char* 转换的警告,并将 *commande 替换为 commande 作为系统函数的参数,同时仍然具有 *commande作为 lance_commande 函数的参数。
错误没有改变,./program "sleep 1" "sleep 2" 输出
sh: 1: Syntax error: EOF in backquote substitution
Segmentation fault (core dumped)
【问题讨论】:
-
不应该是
system(commande)吗? -
首先,启用所有编译器警告并修复警告。
system的返回值的类型是int,而不是char*。 -
@500-InternalServerError
i<argc是正确的。argv[argc]是一个NULL指针,argv[0]是应该跳过的程序名称。但是检查参数的数量应该是if(argc > 1),因为如果没有传递任何参数,它将是 1。 -
然后:否定 te 条件,并提前退出()。 [但是:这是风格问题,我同意]
-
函数
gettimeofday返回成功/错误指示,并需要指针作为参数来返回结果。您的错误声明int gettimeofday();隐藏了此错误,这也可能导致分段错误。要获得以秒为单位的时间,您可能需要t1 = time(NULL);之类的东西。对于gettimeofday,您需要#include <sys/time.h>。
标签: c pointers segmentation-fault char