これはおそらく非常に遅い答えなので、誰も気にしません...要約すると、プログラムにいくつかの問題がありますが、なぜセグメンテーション違反が発生したのか、それを既に修正したのかはわかりません。
コード内:
- 時代遅れ
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);
}