簡體   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