LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1534|回复: 10

ld-linux.so.2问题?

[复制链接]
发表于 2005-6-23 17:11:53 | 显示全部楼层 |阅读模式
在学进程的时候,按书上写了一个模拟sh命令解析的程序。
调试了好久也没调试出来,检查了好几次语法和是否抄错,应该和书上一样了(除非书上也错了)
gcc编译的时候出现如下警告:
xfmaple@1[linux网络编程]$ gcc -Wall smallsh.c -o smallsh
smallsh.c: In function `runcommand':
smallsh.c:87: warning: control reaches end of non-void function
smallsh.c: In function `procline':
smallsh.c:97: warning: passing arg 1 of `gettok' from incompatible pointer type
不知道怎么什么意思?
运行程序:
xfmaple@1[linux网络编程]$ ./smallsh
command>ls
command>ld-linux.so.2: No such file or directory
说找不到ld-linux.so.2,这个是否是运行时自动搜索的?
然后我在ld.so.conf里加上/lib后,ldconfig,以后执行结果还是和上面的一样,
在gcc -L/lib -Wall smallsh.c -o smallsh这样在编译了一次可结果还是一样。
在/lib下,ld-linux.so.2是个连接,指向ld-2.3.2.so,这说明是存在的?
不知道怎么回事?求助一下?
1:哪些警告是怎么回事?
2:程序应该没有问题,但就是出现ld-linux.so.2错误,还有有时会出现段错误?
这是怎么引起的?
发表于 2005-6-23 17:32:50 | 显示全部楼层
shell执行时,是需要设置环境变量的!不知道你这的sh,要不要设置!
ld-linux.so.2这个文件肯定是存在的,因为你装了开发工具!

你把代码贴出来看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 17:43:33 | 显示全部楼层
程序代码如下:
[php]
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define EOL 1
#define ARG 2
#define AMPERSAND 3
#define SEMICOLON 4
#define MAXARG 512/*命令行参数个数的最大值*/
#define MAXBUF 512/*输入行的最大长度 */
#define FOREGROUND 0/*前台执行*/
#define BACKGROUND 1/*后台操作*/
void exit(int);/*不写这个会有个警告,不知道怎么回事,没有意义*/
static char inpbuf[MAXBUF],tokbuf[2*MAXBUF],*ptr=inpbuf,*tok=tokbuf;
int userin(char *p)
{
        int c,count;
        ptr=inpbuf;
        tok=tokbuf;
        printf("%s",p);/*命令行提示*/
        for(count=0;;){
                if((c=getchar())==EOF)
                        return(EOF);
                if(count<MAXBUF)
                        inpbuf[count++]=c;
                if(c=='\n' && count<MAXBUF){
                        inpbuf[count]='\0';
                        return(count);
                }
                /*如果输入过长重新输入*/
                if(c=='\n'){
                        printf("smallsh:inpbuf line too long\n");
                                count=0;
                        printf("%s",p);
                }
        }
}
static char special[]={' ','\t','*',';','\n','\0'};/*除去特殊字符*/
int inarg(char c)
{
                char *wrk;
                        for(wrk=special;*wrk!='\0';wrk++)
                                                if(c==*wrk)
                                                                                return(0);
                                return(1);
}


int gettok(char *outptr)
{
        int type;

        outptr=tok;
        for(;*ptr==' '||*ptr=='\t';ptr++);
        *tok++=*ptr;
        switch(*ptr++){
                case'\n':
                        type=EOL;break;
                case'&':
                        type=AMPERSAND;break;
                case';':
                        type=SEMICOLON;break;
                default:
                        type=ARG;
                        while(inarg(*ptr))
                                *tok++=*ptr++;
}
*tok++='\0';
return(type);
}
int runcommand(char **cline,int where)
{
                int pid,exitstat,ret;
if((pid=fork())<0){
         perror("fork fail");
                  return(-1);
  }
          if(!pid) {
         execvp(*cline,cline);
         perror(*cline);
        exit(127);
if(where==BACKGROUND){
printf("[process id %d]\n",pid);
return(0);
}
while((ret=wait(&exitstat)) && ret!=-1);
return(ret==-1?-1:exitstat);
}
}

int procline()
{
        char *arg[MAXARG+1];
        int toktype;
        int narg;
        int type;
        for (narg=0;;)
        {
                switch(toktype=gettok(&arg[narg]))
                {
                        case ARG:
                                if(narg<MAXARG)
                                        narg++;
break;
                        case EOL:
                        case SEMICOLON:
                        case AMPERSAND:
type=(toktype==AMPERSAND)?BACKGROUND:FOREGROUND;
if(narg!=0){
        arg[narg]=NULL;
        runcommand(arg,type);
}
if(toktype==EOL)
        return 0;
        narg=0;
        break;
        }
}
}



int main(int argc,char *argv[])
{
        char *prompt="command>";
        while(userin(prompt)!=EOF)
                procline();
        return 1;
}
[/php]
回复 支持 反对

使用道具 举报

发表于 2005-6-23 21:13:41 | 显示全部楼层
编译通过,没有发生楼主所说的现象。估计是编译环境的问题。是不是其它程序运行也是这样?
程序有点小问题,把这几行改过来:

  1. int gettok(char **outptr)
  2. {
  3.     ......
  4.     *outptr = tok;
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 21:16:37 | 显示全部楼层
其他程序没有问题的,怪了。
斑竹,为什么要改那一行?

改了斑竹那句就可以运行了,破书,气死我了
回复 支持 反对

使用道具 举报

发表于 2005-6-23 21:31:57 | 显示全部楼层
你自己仔细阅读一下程序,如果不改,程序就是错的。
ps:由于排版与印刷的关系,很多图书上的代码都是有错误的,需要自己在实践中改正。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 22:56:01 | 显示全部楼层
斑竹能否提点一下,我看不出问题,而且gettok里面的参数不知道什么用,*outptr=tok;之后就再没用到outptr了,这句有什么用?

而且改了以后只有第一次是执行正确的
command>ls
data     smallsh1   smallsh.h  test1.c  test2.c  testarg.c
smallsh  smallsh.c  test1      test2    testarg
command>ls
No such file or directory

斑竹执行的结果是怎么样的?
回复 支持 反对

使用道具 举报

发表于 2005-6-24 00:57:02 | 显示全部楼层
俺只知道ld-linux.so.2是动态链接器----------
回复 支持 反对

使用道具 举报

发表于 2005-6-24 11:08:55 | 显示全部楼层
你仔细看看,我要求改正的是两个语句,不是一个。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-24 11:21:01 | 显示全部楼层
我知道把本来的*outptr-->**outptr,outptr=tok--->*outptr=tok
是这两个吧,还是两个疑惑
1:本来的程序,我看不出什么错误,希望斑竹能说一下?
2:我只能正确的运行一次,以后的就都是No such file or directory,不知道是程序还有错误,还是我的编译环境的关系?斑竹你执行的结果是怎么样的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表