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

时间:2017-09-30 02:00:48

标签: c pointers struct fork

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

Here is a photo of my ouput]

#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 arguement 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;
}

1 个答案:

答案 0 :(得分:0)

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

解决方案:

替换:

testParam->inputRedirect = toke[i];

使用:

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

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

Sugestion:

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

Param_t testParam;
Parse( &testParam );

Parse函数填充它。 main内的所有char *个缓冲区testParam免费通话结束{/ 1}}