在我的C程序中,我正在创建一个子进程并在子进程中运行execvp。但我正试图将execvp命令的错误消息更改为其他消息(如果有错误)。
我知道如果它返回,那么它就是一个错误,然后我可以在下一行打印我自己的自定义错误消息。这是一种可能发生的错误,例如,如果我将命令“sdfsd”给execvp,就会发生这种情况。这部分对我有用。
但如果我键入“find sdfsd”,则它不会返回并打印“find:`sdfsd':没有这样的文件或目录”。
我想将此消息(以及来自exevcp的任何类型的错误消息)更改为我自己的自定义消息。
我相信我可以用dup2来做这个,但我不知道怎么。。。
在孩子的过程中我试着
dup2(STDERR_FILENO, 1);
fclose(stderr);
但这只是阻止子进程写入任何错误消息。我还是不能在所有情况下打印我自己的信息。。
有人知道怎么做吗?
谢谢
最佳答案
由于如果成功启动新程序,execvp
将不会返回,因此在execvp
运行的程序失败后,您将无法在子进程中打印自己的错误消息。一种方法是将stderr
管道传输到父进程,在那里截取错误消息,然后打印自己的错误消息。
例如:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int ff, p[2];
FILE *f;
char *vv[] = {"find", "garbage", (char *)NULL};
char msg[100];
if (pipe(p) != 0)
{
fprintf(stderr, "Pipe failed\n");
return 1;
}
if ((ff = fork()) == -1 )
{
fprintf(stderr, "Fork failed\n");
return 1;
}
if (ff == 0)
{
/* In the child process */
close(2);
close(p[0]);
dup2(p[1], 2);
execvp("find", vv);
return 1;
};
/* In the parent process */
close(p[1]);
f = fdopen(p[0], "r");
if (f == NULL)
{
fprintf(stderr, "Fdopen failed\n");
return 1;
}
if (fgets(msg, sizeof(msg), f) == NULL)
{
fprintf(stderr, "Fgets failed\n");
return 1;
}
printf("Error message was: %s", msg);
/* and so on */
return 0;
}
关于c - 如何在子进程中使用dup2?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14514446/