我正在为一个类构建一个简单的shell。我的shell目录中有两个程序,分别称为“ alomundo”和“ echo”。 “ ./alomundo”打印“ Alo mundo!”进行控制台,然后./echo使用给定的args执行ubuntu echo。 关键是我的程序只有在声明char aux [15]时才有效。请注意,我一无所用。谁能知道怎么了?
示例输入为
./ shell回声a b,alomundo,回声abc
正确的输出是
a b
世界末日!
abc
未声明char aux [15]时的输出仅为:
世界末日!
abc
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char aux[15]; // <---- GRRRR
int child; // will hold the childs PID after fork()
int i = 0; // counter to loop through this mains *argv[]
int t = 0; // auxiliar counter to loops
int arg_len; // will hold the length of each argument while the argument is being processed
int args = 0; // current number of arguments in the argv1 vector
int send = 0; // boolean to check if the command should be executed in the current loop or not
char *command; // string to hold the main command name
char *argv1[15]; // vector to hold the arguments passed to execve
for(i=1; i<argc; i++) {
arg_len = strlen(argv[i]);
argv1[args] = (char *) malloc(sizeof(char) * 25);
for(t=0; t<25; t++) {
argv1[args][t] = '\0';
}
if (argv[i][arg_len-1] == ',') {
argv[i][arg_len-1] = '\0';
send = 1;
}
else if (i == (argc-1)) {
send = 1;
}
if (args == 0) {
command = (char *) malloc(sizeof(char) * 255);
strcpy(command, "./");
strcpy(argv1[args], "./");
strcat(command, argv[i]);
}
strcat(argv1[args], argv[i]);
args++;
if (send) {
child = fork();
if (child == 0) {
argv1[args+1] = 0;
execve(command, &argv1[0], envp);
return 0;
}
else {
waitpid(child);
free(command);
for (t=0; t<args; t++) {
free(argv1[t]);
argv1[t] = NULL;
}
args = 0;
send = 0;
}
}
}
return 0;
}
答案 0 :(得分:0)
waitpid(child)
似乎是错误的。试试:// ...
#include <sys/wait.h>
// ...
pid_t child;
int wstatus;
// ...
else {
wait(&wstatus);
envp
未声明。试试:// ...
int main(int argc, char *argv[], char *envp[]) {
// ...
argv1
处理中出现了一个错误。试试:// ...
if (child == 0) {
argv1[args] = 0;
execve(command, argv1, envp); // why use &argv1[0] ?
// ...
我认为(3)是元凶。
使用不同级别的优化(-O
等进行编译似乎会影响错误的+1
是否会引起问题。