0

私のCプログラムでは、子プロセスを作成し、子でexecvpを実行しています。しかし、execvpコマンド(エラーが発生した場合)のために、エラーメッセージを別のメッセージに変更しようとしています。

それが戻った場合、それはエラーであったことを私は知っています、そして私は次の行に私自身のカスタムエラーメッセージを印刷することができます。これは発生する可能性のあるエラーの1つのタイプです。たとえば、execvpにコマンド「sdfsd」を指定すると発生します。この部分は私のために働いています。

しかし、「find sdfsd」と入力すると、返されず、「find: `sdfsd':そのようなファイルまたはディレクトリはありません」と出力されます。

このメッセージ(および基本的にexevcpからのあらゆる種類のエラーメッセージ)を自分のカスタムメッセージに変更したいと思います。

dup2を使用してこれを行うことができると思いますが、方法がわかりません...

子プロセスで私は試しました

dup2(STDERR_FILENO, 1); 
fclose(stderr);

ただし、これにより、子プロセスがエラーメッセージを書き込むのを防ぐことができます。それでも、すべての場合に自分のメッセージを印刷することはできません。

誰かがこれを行う方法を知っていますか?ありがとう

4

1 に答える 1

1

execvp新しいプログラムが正常に開始された場合は決して戻らないため、プログラムの実行が失敗した後、子プロセスに独自のエラーメッセージを出力することはできませexecvpん。1 つのオプションは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;
}
于 2013-01-25T03:05:40.677 に答える