免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6396 | 回复: 26
打印 上一主题 下一主题

[C] [郁闷]chdir,你是咋了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-04 15:01 |只看该作者 |倒序浏览
今天试着写一个简单的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. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-04 15:15 |只看该作者
你程序里面chdir后,只是在程序内部起效。退出就返回shell了。

论坛徽章:
0
3 [报告]
发表于 2010-08-04 15:18 |只看该作者
本帖最后由 allmycheers 于 2010-08-04 15:20 编辑
你程序里面chdir后,只是在程序内部起效。退出就返回shell了。
davelv 发表于 2010-08-04 15:15



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

论坛徽章:
0
4 [报告]
发表于 2010-08-04 15:18 |只看该作者
it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面pwd看看

论坛徽章:
0
5 [报告]
发表于 2010-08-04 15:29 |只看该作者
it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面p ...
haolth 发表于 2010-08-04 15:18



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

论坛徽章:
0
6 [报告]
发表于 2010-08-04 15:39 |只看该作者
回复 5# allmycheers
他说你的程序运行后就是shell的子进程,子进程修改了工作目录后不会影响父进程。
pwd是linux下的一个命令,用来显示当前工作目录的。
cd那个是shell内置的命令,不是单独的二进制程序。shell相当于解释器,解释了cd的含义,不是父子进程的关系。

评分

参与人数 1可用积分 +10 收起 理由
samon_fu + 10 说清楚了CD和LS、PWD等的本质不同。chdir这 ...

查看全部评分

论坛徽章:
0
7 [报告]
发表于 2010-08-04 15:45 |只看该作者
哦,懂了,谢了两位。

论坛徽章:
0
8 [报告]
发表于 2010-08-04 15:52 |只看该作者
要想改变路径。最简单的,你在chdir()函数后面加一个 system("bash");
这样,就回新建一个bash进程,作为你当前进程的子进程,子进程继承了父进程的工作目录,所以你就chdir就生效了。
不过这个bash是新建的,不是原先的shell,要exit命令后才能回到原先的shell,而且工作目录没有受到你新进程的影响。

论坛徽章:
0
9 [报告]
发表于 2010-08-04 16:31 |只看该作者
回复  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这个文件存在

论坛徽章:
0
10 [报告]
发表于 2010-08-04 16:38 |只看该作者
本来是这么回事。但是我发现一件比较疯狂的事居然真的有cd这个文件存在
beyond_touch 发表于 2010-08-04 16:31

我系统下没有这个文件,Fedora Linux 2.6.32
你什么系统?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP