Memory fork变量随机变化

Memory fork变量随机变化,memory,fork,Memory,Fork,我想使用execvp在我的程序中运行命令。提示用户输入命令(在eof上退出) 一旦程序有了一个命令,它就会在父进程等待子进程完成的同时,派生一个子进程来处理该命令 我正在标记输入,以将其存储在char*数组中,该数组由变量'I'跟踪。 除了“i”在while循环的每次迭代中都不断更改其值 样本输入:/bin/ls-l #include <stdio.h> #include <sys/types.h> #include <sys/wait.h&

我想使用execvp在我的程序中运行命令。提示用户输入命令(在eof上退出)

一旦程序有了一个命令,它就会在父进程等待子进程完成的同时,派生一个子进程来处理该命令

我正在标记输入,以将其存储在char*数组中,该数组由变量'I'跟踪。

除了“i”在while循环的每次迭代中都不断更改其值

样本输入:/bin/ls-l

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

    #define BUFFER 1024

    int main(){
            pid_t p;
            char* paramList[] = {};
            char input[BUFFER];
            int i = 0;
            char* segments;
            printf(">");
            while(fgets(input, BUFFER, stdin) != NULL){
                if((p = fork()) == 0){
                        printf("Executing: %s\n", input);
                        i = 0;
                        segments = strtok(input, " ");
                        paramList[i] = segments;
                        printf("%s%d\n", paramList[i], i);
                        i++;
                        while(segments != NULL){
                                segments = strtok(NULL, " ");
                                paramList[i] = segments;
                                printf("%s%d\n", segments,  i);
                                i++;
                        }
                        paramList[i] = NULL;
                        execvp(paramList[0], paramList);
                }else{
                        printf(">");
                        waitpid(p, NULL, 0);
                }
        }
        return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义缓冲区1024
int main(){
pid_t p;
char*paramList[]={};
字符输入[缓冲区];
int i=0;
字符*段;
printf(“>”);
while(fgets(输入、缓冲区、标准输入)!=NULL){
如果((p=fork())==0){
printf(“正在执行:%s\n”,输入);
i=0;
段=strtok(输入“”);
参数列表[i]=段;
printf(“%s%d\n”,参数列表[i],i);
i++;
while(段!=NULL){
段=strtok(空,“”);
参数列表[i]=段;
printf(“%s%d\n”,段,i);
i++;
}
paramList[i]=NULL;
execvp(paramList[0],paramList);
}否则{
printf(“>”);
waitpid(p,NULL,0);
}
}
返回0;
}

您没有为
参数列表
声明大小,而是为其提供了一个空的初始值设定项列表;因此,
paramList
具有零元素。然后你在其中写入了超过零的元素,溢出到其他局部变量上(如
i
)。

你能更准确地说明你的程序到底出了什么问题吗?好的,这解决了我使用“i”变量时遇到的问题。paramList现在是一个由10个元素组成的数组,但是当我将我的令牌分配给该列表时,它就不起作用了。如果我在参数列表中硬编码“/bin/ls”、“-l”,它可以正常工作。