1

ソケットから取得した入力を実行しようとしています。私はメッセージバッファを取得してに入れました.nullchar *[]で終了しましlsたが、のようなパラメータでは機能しませんls -la

char *CMD[msg.c+1];
CMD[msg.c] = NULL;

これが私の解析と使用execvpです。

//parse
char *tmp = NULL;
tmp = strtok(msg.v,space);
for(i = 0; i < msg.c; i++){
    CMD[i] = tmp;
    tmp = strtok(NULL,space);
    printf("%s\n",CMD[i]);
}

int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == 0) {
        close(fd[0]);
        dup2(fd[1], 1);
        msg.c = execvp(CMD[0],CMD);
    }
4

1 に答える 1

1

これはおそらく非常に遅い答えなので、誰も気にしません...要約すると、プログラムにいくつかの問題がありますが、なぜセグメンテーション違反が発生したのか、それを既に修正したのかはわかりません。

コード内:

  • 時代遅れstrsep(3)の代わりに使用 strtok(3)
  • strdup(3)他のコードが変更されていないことを確認するために、変更さmsgれていない場合は、strdup を削除して解放することができます
  • err(3)エラーを早期に (早期に) 発見するために、いくつかのエラー処理を追加しました。
  • できませんmsg.c = execvp(CMD[0], CMD)。プログラムは CMD を実行しており、戻りません。終了コードを取得できるようにするには、wait(2)またはを使用しますwaitpid(2)
  • 可変長の配列 ( char *CMD[msg.c+1]) は C99 で許可されていますが、私は使用しません。必要に応じて使用できます。:)

そして、これは長いコードで、おそらく多くのバグがありますが、教えてください。修正を試みます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <err.h>
#include <sys/types.h>
#include <sys/wait.h>

#define MAX_ARGS 10

int 
main(int argc, char *argv[])
{   
        char *cmd[MAX_ARGS];
        char *s;
        char buf[256];
        char msg[] = "ls -la /";
        int n;
        int fd[2];
        pid_t pid;
        int stat;

        if ((s = strdup(msg)) == NULL)
                err(1, "strdup");
        for (n = 0; n < MAX_ARGS && (cmd[n] = strsep(&s, " ")) != NULL; n++)
                ;

        if (pipe(fd) == -1)
                err(1, "pipe");
        switch ((pid = fork())) {
        case -1:
                close(fd[0]);
                close(fd[1]);
                err(1, "fork");
        case 0: /* child */
                close(fd[0]);
                dup2(fd[1], STDOUT_FILENO);
                close(fd[1]);
                execvp(cmd[0], cmd);
                err(1, "execvp");
        default: /* parent */
                free(s);
                close(fd[1]);
                while ((n = read(fd[0], buf, sizeof(buf))) > 0)
                        write(STDOUT_FILENO, buf, n);
                waitpid(pid, &stat, 0);
                fprintf(stderr, "child(%d) exited with %d\n",
                        pid, WEXITSTATUS(stat));
        }
        return (0);
}
于 2013-01-08T17:10:20.467 に答える