CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

关于程序中调用cd和ls指令的问题,初学linux ,请大家帮忙!谢谢!

楼主syncrow(天天)2005-04-28 17:26:55 在 Linux/Unix社区 / 程序开发区 提问

我想要实现的是在运行程序,输入指令(如cd   ls之类)后   ,   程序调用系统的cd   ls指令输出相应内容.现在只能够传入一个字符串,这个问题不是关键的,我现在最大的问题是,我运行程序后,输入cd这个指令,总说找不到,  
  ls指令是可以找到的.     帮我看看是怎么回事,谢谢!  
   
  我运行cd和ls的结果是:  
   
  myclient   >:   cd  
      path=   /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin  
      buf=/root/bin6/bin/cd  
  can't   find  
   
  myclient   >:   ls  
      path=   /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin  
      buf=/bin/ls  
  makefile     myprogram     pchar     pchar.c     pchar.d     pchar.o/*该目录下面的文件*/  
   
   
  我调用指令   whereis   查看cd和   ls指令的位置,输出如下  
    whereis   cd  
  cd:   /usr/share/man/man1/cd.1.gz   /usr/share/man/mann/cd.n.gz  
    whereis   ls  
  ls:   /bin/ls   /usr/share/man/man1/ls.1.gz  
   
  源代码如下:  
  #include   <string.h>  
  #include   <stdio.h>  
  #include   <sys/wait.h>  
  #include   <unistd.h>  
                                                                                                                                                                                                           
  char   buffer[128];  
  int   is_command_exist   (char   *);  
                                                                                                                                                                                                           
  int   main   (int   argc,   char   *argv[])  
  {  
      char   input_buf[128];  
      int   i,   j,   k;  
      int   lc_input_len   =   0;  
      char   lc_char;  
      char   bake_input[128];  
      char   *arg[10];  
      int   pid;  
  /*获取输入的字符串*/  
      while   (1)  
      {  
          printf   ("myclient   >:   ");  
          lc_char   =   getchar   ();  
          while   (lc_char   !=   '\n'   &&   lc_input_len   <   128)  
          {  
              input_buf[lc_input_len++]   =   lc_char;  
              lc_char   =   getchar   ();  
          }  
          if   (lc_input_len   >   128)  
          {  
              printf   ("your   input   is   too   long!   reinput\n");  
              lc_input_len   =   0;  
              continue;  
          }  
          else  
          {  
              input_buf[lc_input_len]   =   '\0';  
              strcpy   (bake_input,   input_buf);  
              break;  
          }  
      }  
   
      for   (i   =   0,   j   =   0,   k   =   0;   i   <=   lc_input_len;   i++)  
      {  
          if   (bake_input[i]   ==   '   '   ||   bake_input[i]   ==   '\t'   ||   bake_input[i]   ==   '\0')  
          {  
              if   (j   ==   0)  
                  continue;  
              else  
              {  
                  input_buf[j++]   =   '\0';  
                  arg[k]   =   (char   *)   malloc   (sizeof   (char)   *   j);  
                  strcpy   (arg[k],   input_buf);  
                  printf   ("arg[%d]   =%s   ",   k,   arg[k]);  
                  j   =   0;  
                  k++;                                                                                                                                                                                                          
              }  
          }  
          else  
          {  
              input_buf[j++]   =   bake_input[i];  
          }  
      }  
   
  /*调用shell的指令*/  
      if   (is_command_exist   (arg[0])   ==   -1)  
      {  
          printf   ("can't   find\n");  
          printf   ("     buf=%s\n",   buffer);  
          exit(1);                                                                                                                                                                                                          
      }  
   
      printf   ("     buf=%s\n",   buffer);  
   
      if   ((pid   =   fork   ())   ==   0)  
          execv   (buffer,   arg);  
      else  
          waitpid   (pid,   NULL,   0);  
                                                                                                                                                                                                           
      for   (i   =   0;   i   <   k;   i++)  
          free   (arg[i]);  
                                                                                                                                                                                                           
      return   0;  
  }  
  /*查看指令是否存在*/  
  int  
  is_command_exist   (char   *comm)  
  {                                                                                                                                                                                                          
      char   *path,   *p;  
      int   i   =   0,   j   =   0;  
      path   =   getenv   ("PATH");  
  //   printf   ("     path=   %s     \n",   path);  
      p   =   path;  
      while   (*(p   +   j)   !=   '\0')  
      {  
          if   (*(p   +   j)   !=   ':')  
              buffer[i++]   =   *(p   +   j);  
          else  
          {  
              buffer[i++]   =   '/';  
              buffer[i]   =   '\0';  
              strcat   (buffer,   comm);  
              if   (access   (buffer,   F_OK)   ==   0)  
                  return   0;  
              else  
                  i   =   0;  
          }  
          j++;  
      }  
      return   -1;  
  }  
   
   
  问题点数:20、回复次数:8Top

1 楼loveleijuforever(苦力)回复于 2005-04-28 18:16:28 得分 3

main()  
  {  
  int   pid;  
  /*   fork   子进程   */  
  pid=fork();  
  switch(pid)   {  
  case   -1:  
  perror("fork   failed");  
  exit(1);  
  case   0:  
  execl("/bin/ls","ls","-l","--color",NULL);  
  perror("execl   failed");  
  exit(1);  
  default:  
  wait(NULL);  
  printf("ls   completed\n");  
  exit(0);  
  }  
  }  
  这样不就的了?用不着你那么麻烦吧Top

2 楼syncrow(天天)回复于 2005-04-28 18:38:02 得分 0

to   loveleijuforever:   你好,是我没说清楚,我要做的是一个网络传输程序,由client方面把指令输入,指令是由用户输入的,所以用了前面的获取字符串的程序,的确,在我提的这个问题上是可以不用这段来获取的.  
  谢谢你!  
  我还是要在说一下我的问题是,我输入cd这个指令无法找到,  
   
  如果把你的程序该成cd指令的话,  
   
  #include   <stdio.h>                                                                                                                                                                  
  main()  
  {  
  int   pid;  
  /*   fork   子进程   */  
  pid=fork();  
  switch(pid)   {  
  case   -1:  
  perror("fork   failed");  
  exit(1);  
  case   0:  
  execl("/bin/cd","cd","-l","--color",NULL);  
  perror("execl   failed");  
  exit(1);  
  default:  
  wait(NULL);  
  printf("ls   completed\n");  
  exit(0);  
  }  
  }  
   
  在我的电脑上的执行结果是:  
  #   ./get_cd  
  execl   failed:   No   such   file   or   directory  
  ls   completed  
   
  你认为问题出在哪里?Top

3 楼gomo544409(gomo)回复于 2005-04-29 09:56:14 得分 3

ls   和   cd   好像都是bash的内嵌命令。   不存在于/bin或/sbin下面!  
  Top

4 楼gamedragon(gamedragon)回复于 2005-04-29 11:50:48 得分 4

cd和ls是shell命令,是shell执行的。Top

5 楼syncrow(天天)回复于 2005-04-29 12:23:58 得分 0

to   gamedragon(gamedragon)   :  
        是啊,在程序里面使用exec系列函数是可以调用的.  
   
  to   gomo544409(gomo)   ;    
                ls在/bin下面是有的,cd没有,不知道怎么调用cd?还是有可以实现类似功能的调用?  
   
  谢谢Top

6 楼schwarzenegger(找不到服务器)回复于 2005-04-30 17:03:37 得分 0

chdirTop

7 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-05-01 11:24:58 得分 5

chdir                       =     cd  
  opendir   readdir   =   ls  
   
   
  也可以   system("ls")Top

8 楼Dizovin(。握紧刀锋。。。)回复于 2005-05-12 11:25:52 得分 5

可以用system("命令")Top

相关问题

  • 小弟初学,请教如何调用?
  • 初学者问题(JSP调用JavaBean)
  • 初学者,调用窗体问题?
  • 初学jsp调用JAVABEAN问题。
  • 初学者一函数调用问题!
  • 初学linux!!
  • 初学linux驱动
  • 初学者请教!如何在PB中调用外部程序?
  • 初学jsp不久,就是不知怎么调用数据库。
  • -------初学小菜:关于函数调用的问题!------

关键词

  • 指令
  • root
  • 调用
  • ls
  • cd
  • 程序
  • 谢谢
  • lc
  • bin
  • sbin

得分解答快速导航

  • 帖主:syncrow
  • loveleijuforever
  • gomo544409
  • gamedragon
  • sharkhuang
  • Dizovin

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo