我的程序仅在声明额外的数组时起作用

时间:2019-03-22 02:16:57

标签: c shell ubuntu unix gcc

我正在为一个类构建一个简单的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;
}

1 个答案:

答案 0 :(得分:0)

  1. waitpid(child)似乎是错误的。试试:
// ...
#include <sys/wait.h>
// ...
    pid_t child;
    int wstatus;
// ...
            else {
                wait(&wstatus);
  1. envp未声明。试试:
// ...
int main(int argc, char *argv[], char *envp[]) {
// ...
  1. argv1处理中出现了一个错误。试试:
// ...
            if (child == 0) {
                argv1[args] = 0;
                execve(command, argv1, envp); // why use &argv1[0] ?
// ...

我认为(3)是元凶。

使用不同级别的优化(-O等进行编译似乎会影响错误的+1是否会引起问题。