簡體   English   中英

模擬UNIX類型的shell

[英]Simulating the UNIX type shell

我正在嘗試實現UNIX類型的shell。 我尚未實現創建一個子進程來運行每個命令部分的外殼程序,但這只是一個代碼,用於通過使用空格作為定界符將用戶在命令提示符下輸入的字符串分解為適當的參數,然后將作為命令行參數傳遞給與命令相對應的文件(例如ls -l)。

它可以在Windows 7操作系統上正常運行,但是當我在Ubuntu上以輸入字符串“ ABC XYZ WGH”運行它時,出現了一個錯誤,提示“未定義符號'printf'版本ABC”。 請幫助我了解,我要去哪里錯了?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int arguments(char str[],char *** args)
{
    char *s;
    int num;
    int i;
    s=(char*)calloc(strlen(str)+1,sizeof(char));
    strcpy(s,str);
    if(strtok(s," ")==NULL)
    num=0;
    else
    {
        num=1;
        while(strtok(NULL," ")!=NULL)
        num++;
    }
    strcpy(s,str);
    **args=strtok(s," ");
    if(num)
    {
       for(i=1;i<num;i++)
       *((*args)+i)=strtok(NULL," ");
    }
    return num;
}


int main()
{
    char buffer[256];
    char **arg;
    int args;
    int i;
    while(true)
    {
           gets(buffer);
           if(!strcmp(buffer,"STOP"))
           break;
           args=arguments(buffer,&arg);
           printf("%d\n",args);
           for(i=0;i<args;i++)
           printf("%s\n",arg[i]);

    }
    return 0;
}

在gdb下,我得到:

Program received signal SIGSEGV, Segmentation fault. 0x00000000004007a8 in arguments (str=0x7fffffffe010 "", args=0x7fffffffe000) at uc:20 20 **args=strtok(s," ");

即,您使用的指針指向的指針指向無可用的指針:這是未定義的行為,這可能就是為什么您會收到諸如““未定義符號'printf'版本ABC。”之類的奇怪東西,或gdb下的分段錯誤的原因。

我建議您用更少的間接級別(以及更好地使用strtok() =)來重寫fonction arguments() ,但是現在這段代碼可以滿足您的要求:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 32

int arguments(char str[],char **args)
{
    char *s;
    int num;
    int i;
    s=malloc(strlen(str)+1);
    strcpy(s,str);
    if(strtok(s," ")==NULL)
        num=0;
    else {
        num=1;
        while(strtok(NULL," ")!=NULL)
        num++;
    }
    strcpy(s,str);
//  **args=strtok(s," ");
    *args=strtok(s," ");
    if(num)
    {
       for(i=1;i<num;i++)
//         *((*args)+i)=strtok(NULL," ");
           args[i] = strtok(NULL," ");
    }
    return num;
    // note. 's' is not free()'d ..
}

int main()
{
    char buffer[256];
    char *arg[MAX];
    int args;
    int i;

    while(1)
    {
           gets(buffer);
           if(!strcmp(buffer,"STOP"))
               break;
           args=arguments(buffer, arg);
           printf("%d\n",args);
           for(i=0;i<args;i++)
               printf("%s\n",arg[i]);

    }
    return 0;
}

暫無
暫無

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

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