+ -
当前位置:首页 → 问答吧 → [郁闷]chdir,你是咋了?

[郁闷]chdir,你是咋了?

时间:2010-08-04

来源:互联网

今天试着写一个简单的cd命令,但是改变不了文件路径!代码贴出来,大家看看,帮我改改。
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. int main(int argc, char *argv[])
  5. {
  6.         if (argc > 2)
  7.         {
  8.                 printf("输入错误!\n");       
  9.                 return 0;
  10.         }

  11.         if (argc == 1)
  12.         {
  13.                 FILE *fp;
  14.                 char buffer[128];
  15.                 fp = popen("echo $HOME", "r");
  16.                 fgets(buffer,sizeof(buffer),fp);
  17.                 printf("%s", buffer);
  18.                 chdir(buffer);
  19.                 pclose(fp);
  20.         }

  21.         if (argc == 2)
  22.         {
  23.                 chdir(argv[1]);
  24.         }
  25.         return 0;
  26. }
复制代码

作者: allmycheers   发布时间: 2010-08-04

你程序里面chdir后,只是在程序内部起效。退出就返回shell了。

作者: davelv   发布时间: 2010-08-04

本帖最后由 allmycheers 于 2010-08-04 15:20 编辑


QUOTE:
你程序里面chdir后,只是在程序内部起效。退出就返回shell了。
davelv 发表于 2010-08-04 15:15




    怎么修改成真正的cd命令?

作者: allmycheers   发布时间: 2010-08-04

it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面pwd看看

作者: haolth   发布时间: 2010-08-04



QUOTE:
it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面p ...
haolth 发表于 2010-08-04 15:18




    我没有创建子进程阿。 以在上面句后面pwd,是什么意思?是在chdir(argv[1]);前面加上getcwd吗

作者: allmycheers   发布时间: 2010-08-04

回复 allmycheers
他说你的程序运行后就是shell的子进程,子进程修改了工作目录后不会影响父进程。
pwd是linux下的一个命令,用来显示当前工作目录的。
cd那个是shell内置的命令,不是单独的二进制程序。shell相当于解释器,解释了cd的含义,不是父子进程的关系。

作者: davelv   发布时间: 2010-08-04

哦,懂了,谢了两位。

作者: allmycheers   发布时间: 2010-08-04

要想改变路径。最简单的,你在chdir()函数后面加一个 system("bash");
这样,就回新建一个bash进程,作为你当前进程的子进程,子进程继承了父进程的工作目录,所以你就chdir就生效了。
不过这个bash是新建的,不是原先的shell,要exit命令后才能回到原先的shell,而且工作目录没有受到你新进程的影响。

作者: davelv   发布时间: 2010-08-04



QUOTE:
回复  allmycheers
他说你的程序运行后就是shell的子进程,子进程修改了工作目录后不会影响父进程。
pwd ...
davelv 发表于 2010-08-04 15:39


本来是这么回事。但是我发现一件比较疯狂的事
  1. $ ls /usr/bin | grep cd
  2. cd
  3. distccd
  4. $ /usr/bin/cd -h
  5. /usr/bin/cd: line 4: cd: -h: invalid option
  6. cd: usage: cd [-L|-P] [dir]
复制代码
居然真的有cd这个文件存在

作者: beyond_touch   发布时间: 2010-08-04



QUOTE:
本来是这么回事。但是我发现一件比较疯狂的事居然真的有cd这个文件存在
beyond_touch 发表于 2010-08-04 16:31


我系统下没有这个文件,Fedora Linux 2.6.32
你什么系统?

作者: davelv   发布时间: 2010-08-04

回复 davelv

OSX 10.6.4

作者: beyond_touch   发布时间: 2010-08-04

一直以为cd就是个可执行文件的.
难道不是吗..

作者: pandaiam   发布时间: 2010-08-04

回复 pandaiam
正常情况下,cd是shell内置命令

作者: beyond_touch   发布时间: 2010-08-04



QUOTE:
回复  davelv

OSX 10.6.4
beyond_touch 发表于 2010-08-04 16:40


我一直以为用MAC的人都不屑于使用控制台,以至于我后来都觉得苹果可以把terminal去掉了。。。
你用的什么版本的shell?

作者: davelv   发布时间: 2010-08-04

哪些是shell内置命令呢?
有啥区分的方法没..

作者: pandaiam   发布时间: 2010-08-04

回复 davelv


    GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)

作者: beyond_touch   发布时间: 2010-08-04

回复 pandaiam
  1. $ info bash
复制代码

作者: beyond_touch   发布时间: 2010-08-04

相关阅读 更多

热门下载

更多