繁体   English   中英

我正在用 C 编写一个 shell,但在结构中指向 char 数组的指针时遇到问题

[英]I'm writing a shell in C and I am having trouble with pointers to char arrays in a struct

当我运行我的代码时,第一个printParams()调用完美运行。 但是在fork()之后的每次调用,该struct都会丢失其所有char数组值。 我对指针不是很了解,但我可以看出这个问题的根源可能是基于指针的。 例如,第一个printParams()将打印出Parse()函数中分配的所有值。 但是在fork()之后,会显示所有整数值,例如backgroundargumentCount ,但不会显示与inputRedirect关联的字符串值或保存在vectorArguments数组中的字符串值。

![这是我输出的照片]] 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "parse.h"

void printParams(Param_t * param);

struct PARAM
{
    char *inputRedirect;           /* file name or NULL */
    char *outputRedirect;          /* file name or NULL */
    int background;                /* ethier 0 (false) or 1 (true) */
    int argumentCount;             /* number of tokens in argument vector 
    */
    char *argumentVector[MAXARGS]; /* array of String */
};

typedef struct PARAM Param_t;

int main(int argc, char *argv[]){
    int i;
    int debug;
    pid_t pid;
    
    if(argc>1){
        if(!strcmp(argv[1], "-debug"))
            debug = 1;
    }
   
    Param_t * testParam = Parse();
    
    if(debug == 1){
        printParams(testParam);
    }

    pid = fork();       
    printParams(testParam);
    
    if(pid == 0){
        exit(1);
    }       
    return 0;
}

void printParams(Param_t *param)
{
    int i;
    
    printf("InputRedirect: [%s]\n", (param->inputRedirect != NULL) ? param-
    >inputRedirect: "NULL");
    printf("OutputRedirect: [%s]\n", (param->outputRedirect != NULL) ? 
    param->outputRedirect: "NULL");
    printf ("Background: [%d]\n", param->background);
    printf ("ArgumentCount: [%d]\n", param->argumentCount);
    
    for (i = 0; i < param->argumentCount; i++)
        printf("ArgumentVector[%2d]: [%s]\n", i, param->argumentVector[i]);     
}

Param_t* Parse(){
    char *toke[MAXARGS];
    int i = 0;
    char str[MAXSTRLENGTH];
    int j;
    int k=0;
    
    Param_t* testParam = malloc(sizeof(Param_t));
    testParam->argumentCount = 0;
    
    printf("Enter your commands:\n");
    fgets(str, MAXSTRLENGTH, stdin);
    
    toke[i] = strtok(str, " ");

    //Tokenizes the user input into the toke array
    while(toke[i] != NULL){
        //printf("%s\n", toke[i]);
        ++i;
        toke[i] = strtok(NULL, " ");
    }
    
    i=0;  
    char c;
    
    while(toke[i] != NULL){
        c = toke[i][0];
        if(c == '<')
        {
            for(j=0; j<strlen(toke[i]); ++j ){
                toke[i][j] = toke[i][j+1];
            }
            testParam->inputRedirect = toke[i];
        }
        else if(c == '>')
        {
            for(j=0; j<strlen(toke[i]); ++j ){
                toke[i][j] = toke[i][j+1];
            }
            testParam->outputRedirect = toke[i];
        }
        else if(c == '&')
        {
            testParam->background = 1;
            //background  
        }
        else
        {
            testParam->argumentVector[k] = toke[i];
            k++;
            //save as cmd vector
        }
        ++i;
    }   
    testParam->argumentCount = k;
    return testParam;
}

丢失所有char *值的原因是strtok()函数不创建缓冲区。 基本上,您的所有char*都包含一个指向您使用fgets()读取的str变量的地址。 str变量的作用域仅限于Parse()函数的末尾。

解决方案:

代替:

testParam->inputRedirect = toke[i];

和:

testParam->inputRedirect = malloc(MAXSTRLENGTH);
memset( testParam->inputRedirect, 0, MAXSTRLENGTH);
memcpy( testParam->inputRedirect, toke[i], strlen(toke[i]) );

但请注意,这会导致内存泄漏,因为没有free()

建议:

main中创建结构的静态实例并将其指针指向Parse函数。

Param_t testParam;
Parse( &testParam );

Parse函数填充它。 并且在testParam中的所有char *缓冲区的main调用结束时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM