繁体   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