0

当我execvp使用命令及其参数调用时,有时该命令是不合法的。

例如,如果我使用分叉的SON进程在我的 shell(bash shell)中执行此操作:

$ ls ffdfdfd

那么输出是:

$ ls: cannot access ffdfdfd: No such file or directory

现在,我想将确切的消息传递给文件。我试过perror这样:

void directErrors(char * arg)
{
    perror(arg);  // execute the problem to screen

    // now execute the problem to file

    FILE* myFile = fopen("errors.log", "a");

     if(myFile == NULL)
     {
         perror("fopen");
         exit(-1);
     }

     fprintf(myFile, "%s: %s\n", arg, strerror(errno));
     fclose(myFile);
}

但它所做的只是写该命令X失败。

如何指导execvp调用后得到的确切输出?

在我的代码中,我execvp这样调用:

executeCurrentCommand = execvp(*(arg)[0], *arg);
4

1 回答 1

3

请记住,exec通过用您正在执行的程序完全替换您的程序来工作。因此,您在 exec() 调用之后编写的任何代码都不会运行:

execvp(cmd, args);
/* This code is never reached.  */

调用返回的唯一方法exec是如果您尝试调用的命令无法运行:例如,如果您尝试执行不存在的文件或没有执行权限的文件。

在您的情况下,命令 ( ls)确实存在,因此 exec确实成功......这意味着它之后的任何代码都不会运行。该ls命令将像往常一样向 stderr 生成错误消息。

如果你想捕捉你的输出,ls你必须更加花哨。例如,您可以打开一个文件以附加到日志文件,然后将dup()其复制为 stderr 文件描述符,然后执行您的 exec 调用。新进程将继承该设置,并且ls发送到 stderr 的所有输出都将附加到日志中。如果您想同时捕获 stdout 和 stderr,请将它们都复制。这就是外壳等如何做到的。

顺便说一句,使用*(arg)[0]对我来说看起来很奇怪:你为什么要使用它?更合理的是(*arg)[0](我认为)。

于 2012-05-28T20:15:13.640 回答