io - 如何在 C 中调用 execvp 后将错误消息传递给文件

标签 io c error-handling

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

例如,如果我使用 fork 的 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);

最佳答案

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

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

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

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

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

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

关于io - 如何在 C 中调用 execvp 后将错误消息传递给文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860215/

相关文章:

java - 从公共(public)方法返回 InputStream

Haskell - 阅读人员名单

objective-c - 根据 NSTimer 更新 UILabel

c - 计数器的问题

c - 'localtime' 函数在第二次调用时崩溃

ssh - Ansible :Unable to parse/etc/ansible/hosts as an inventory source

error-handling - 返回结构或错误的惯用方式是什么?

c - 用 C 语言将文件压缩为运行长度代码的程序

java - 如何检查文件是否存在于 Java 中?

java - 有没有办法查看发送到 Java 方法中的参数值?