我正在尝试编写以下 C 赋值:一个程序 my-if 接受两个参数,它将运行第一个参数,然后在成功时运行第二个参数。这是我想出的:
#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
char ** split(char * s) {
char ** words = malloc(sizeof(char *));
int i = 0;
char * word = strtok(strdup(s), " ");
while (word) {
words = realloc(words, sizeof(char *) * (i + 1));
words[i] = malloc(strlen(word) + 1);
strcpy(words[i++], word);
word = strtok(NULL, " ");
}
words[i] = NULL;
return words;
}
int main(int argc, char * argv[]) {
char ** argv1 = split(argv[1]);
char ** argv2 = split(argv[2]);
int t = fork();
if (t == -1)
exit(1);
else if (t == 0)
execvp(argv1[0], argv1);
else {
int status;
wait(&status);
if (WIFEXITED(status))
printf("exit status %d\n", WEXITSTATUS(status));
}
return 0;
}
我的问题是弄清楚如何在子进程中捕获错误。WIFEXITSTATUS 始终为 0,即使在 shell 中运行相同的命令然后执行 'echo $?' 将打印 127。例如 my-if 'toto' 'tutu' 会给我一个 WEXITSTATUS = 0,即使
$ toto
$ echo $?
$ 127
我尝试了 WSIGNALED、WSTOPPED,但我真的不知道如何捕捉错误。我是在寻找正确的方向,还是完全不同的东西,例如启动一个 shell,然后执行我的命令,错误是 shell 固有的,而不是命令?