1

デバッグ目的で、ログ ファイルを使用してエディターを起動するアプリケーションがあります。エディターはkeditに設定されました。RedHat リリースの更新後、kedit はなくなりました。デフォルトのエディターを変更し、環境変数を追加して、ユーザーが好みのエディターを選択できるようにしました。

問題は、ユーザーが存在しない、またはパスではないエディターに環境変数を設定した場合、何も起こらないことです。エディターが存在するかどうかを確認し、存在しない場合は通知します。C++でそれを行う方法はありますか?

4

3 に答える 3

3

マニュアルでこれらの機能をチェックしてください

char *getenv(const char *name);

int stat(const char *path, struct stat *buf);

またはopenfopen

于 2013-01-31T19:02:13.643 に答える
0

を使用execlpしてエディターを起動できます。エディターは現在の環境で検索しますPATH。また、失敗すると( "そのようなファイルまたはディレクトリはありません")に設定errnoENOENTれるため、存在しないエディタの状態を検出できます。

char *editor = getenv ("EDITOR");
if(execlp(editor, "foo.txt", (char *) 0))
    perror("Error launching editor");
于 2013-01-31T19:21:40.407 に答える
0

fork()またはforkpty()が続いていると仮定しexeclp()ますexecvp()。基本的に、返されるかどうかを確認する必要がありexec?p()ます(失敗した場合にのみ返されます)。その場合は、失敗が発生したことを親プロセスに通知するだけです。これを行う 1 つの方法は、exit()ステータスを使用することです。親はwait()、子プロセスをリープするために使用することで、このステータスを取得できます。

#define EXEC_FAIL_MAGIC 177
void edit (const char *e) {
    int status = 0;
    pid_t p = fork();
    switch (p) {
    default: /* parent */
        while (wait(&status) != p) {}
        break;
    case 0:  /* child */
        execlp(e, e, "foo.txt", (char *)0);
        exit(EXEC_FAIL_MAGIC);
    case -1: /* error */
        fail("fork() failed");
    }
    if (!WIFEXITED(status)) fail("abnormal termination of editor");
    if (WEXITSTATUS(status) == EXEC_FAIL_MAGIC) fail("execlp failed");
    if (WEXITSTATUS(status) != EXIT_SUCCESS) fail("editor had failure");
}
于 2013-01-31T19:28:48.917 に答える