簡體   English   中英

帶有多個命令的 C 語言外殼,分段錯誤(核心轉儲)

[英]Shell in C with multiple commands, segmentation fault(core dumped)

我正在嘗試用 C 為 ubuntu 編寫一個基本的 shell。 我想在一行中執行幾個命令,用分號分隔。 我正在嘗試運行它,但收到消息“分段錯誤(核心已轉儲)”

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include  <sys/types.h>
#ifdef _WIN32
#include <windows.h>
#define chdir _chdir

#else
#include <unistd.h>
#endif

#define MAX_LENGTH 512


int main(int argc, char *argv[]) {
  char *cmd;
  char line[MAX_LENGTH];
   char *token[20];
int i=0;
int j=0;
int k=0;
char* args[20];

  while (1) {
    printf("8334>");
    if (!fgets(line, MAX_LENGTH, stdin)) break;



    while ((cmd = strtok(line, ";")) != NULL)
    {
        printf("<<%s>>\n", cmd);
        strcpy(token[i], cmd);
        i+=1;
        cmd = NULL;
    }

    for(j=0;j<i;j++){
    k=0;

    while ((cmd = strtok(token[j], " ")) != NULL)
    {
        printf("<<%s>>\n", cmd);
        strcpy(args[k],cmd);
        k+=1;
        cmd = NULL;
    }
    args[k]=NULL;

     pid_t  pid;
     int    status;

     if ((pid = fork()) < 0) {     /* fork a child process           */
          printf("*** ERROR: forking child process failed\n");
          exit(1);
     }
     else if (pid == 0) {          /* for the child process:         */
          if (execvp(args[0], args) < 0) {     /* execute the command  */
               printf("*** ERROR: exec failed\n");
               exit(1);
          }
     }
     else {                                  /* for the parent:      */
          while (wait(&status) != pid)       /* wait for completion  */
               ;
     }


    for(int l=0;l<20;l++)
    args[l]=NULL;



    }
}return 0;
}

我看到的主要事情是您沒有保留空間用於將字符串復制到args[i]token[i] 您正在為指針數組保留空間,但不是為指針指向的內容保留空間:

char *token[20]; // reserves place for 20 pointers
...
strcpy(token[i], cmd);  // token[i] has not been initialized...

克服這個問題的最簡單方法可能是編寫

token[i] = strdup(cmd); 

而不是strcpy ; 請注意, strdup自動保留足夠的內存來保存副本,而strcpy期望此空間之前已經保留。

無論如何,不​​要忘記釋放不再使用的內存,並且不要忘記對args也這樣做。

代碼中也可能存在其他問題; 例如,當使用strtok ,只有第一次調用會傳遞要拆分的行,而所有連續的調用都應該傳遞NULL (請參閱 doku)。 但我認為這是您和您的調試器可以取得領先的水平:-)

問題的根源是這一行:

strcpy(token[i], cmd);

這是試圖將該字符串復制到char *token[20]的條目,但是,這只是一個指針數組,而不是指向字符串的指針數組。

也許你可以使用:

token[i] = strdup( cmd );

當然,代碼隨后需要檢查 (!=NULL) token[i]以確保對strdup()的調用成功,並且在使用特定命令后,將該指針傳遞給free()

類似的考慮適用於char *args[20]; 用法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM