【发布时间】:2017-04-19 02:48:49
【问题描述】:
当我尝试执行/bin/time /bin/echo Hello world 时,我的程序出现问题,我没有得到任何输出。我知道这个示例代码有效
例如 /bin/date 或 /bin/echo ,我认为它也应该与时间一起工作,但它不是
int main(int argc, char * argv []) {
int err = 1;
char *array[3] = {"/bin/time", "/bin/echo", "Hello World"};
pid_t childPIorZero = fork();
if (childPIorZero < 0){
perror("fork() error");
exit(-1);
}
if (childPIorZero != 0){
printf("I'm the parent %d, my child %d\n",getpid(),childPIorZero);
wait(NULL);
}
else{
printf("I'm the child %d, my parent %d\n",getpid(), getppid());
err = execv(array[0], array);
printf("error = %d\n", err);
printf("%s\n", strerror(err));
}
return 0;
}
我虽然问题是我以错误的方式将参数传递给 execv,但它适用于 echo bin 和 date bin,所以我不知道出了什么问题。输出如下:
I'm the parent 28001, my child 28011
I'm the child 28011, my parent 28001
error = -1
Unknown error -1
【问题讨论】:
-
array末尾需要一个空指针:char *array[] = { "/bin/time", "/bin/echo", "Hello World", 0 };。否则,execv()不知道参数列表何时结束 - 或者它在遇到空指针时结束,这可能不会有一段时间,天知道你得到了什么垃圾。 -
但是,这不一定是您的直接问题。你确定你有一个
/bin/time而不是/usr/bin/time?从execv()捕获返回值没有任何好处;如果返回,则失败。要传递给strerror()的值应该是errno;这不是来自execv()的返回状态,因为所有错误编号都是正数。如果execv()失败,则以非零(失败)状态退出也是一个好主意。并且错误消息应该打印到stderr,而不是stdout。 -
谢谢,@JonathanLeffler 我尝试使用 null 完成,但它不起作用,正如我所说我已经尝试使用
/bin/echo并且它有效,所以我认为它应该有效。我也尝试将路径更改为/usr/bin/time,但也没有用 -
谢谢,@JonathanLeffler 我设法让它工作,但我不知道为什么我必须像这样指定时间目录
/usr/bin/time/而回声只有在我这样写时才有效这个/bin/echo,如果我这样做/usr/bin/echo,我会得到一个错误。这很奇怪,因为我去了 dir /bin/ 并执行了 echo 并且它起作用了,但是在那之后我做了ls并且我在 dir 列表中找不到 echo,这是我的操作系统的问题吗? -
我对@987654342@ 上的斜杠没有现成的解释。如果你有
/bin/echo,你可能没有/usr/bin/echo(尽管因为/bin和/usr/bin之一是Solaris上另一个的符号链接,你可能没有在那里运行,但如果你是,你没有那个问题)。echo命令是一个内置的 shell,但也是一个单独的可执行文件。你在哪个平台?在 macOS Sierra 上,有/usr/bin/time,但没有/bin/time。 Linux(Ubuntu 16.04 LTS)似乎也是如此。尝试删除尾部斜杠。