Chinaunix

标题: [郁闷]chdir,你是咋了? [打印本页]

作者: allmycheers    时间: 2010-08-04 15:01
标题: [郁闷]chdir,你是咋了?
今天试着写一个简单的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. }
复制代码

作者: davelv    时间: 2010-08-04 15:15
你程序里面chdir后,只是在程序内部起效。退出就返回shell了。
作者: allmycheers    时间: 2010-08-04 15:18
本帖最后由 allmycheers 于 2010-08-04 15:20 编辑
你程序里面chdir后,只是在程序内部起效。退出就返回shell了。
davelv 发表于 2010-08-04 15:15



    怎么修改成真正的cd命令?
作者: haolth    时间: 2010-08-04 15:18
it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面pwd看看
作者: allmycheers    时间: 2010-08-04 15:29
it's ok 的,,子进程不会改变父进程当前目录,,so退出程序观察不到, chdir(argv[1]); 可以在上面句后面p ...
haolth 发表于 2010-08-04 15:18



    我没有创建子进程阿。 以在上面句后面pwd,是什么意思?是在chdir(argv[1]);前面加上getcwd吗
作者: davelv    时间: 2010-08-04 15:39
回复 5# allmycheers
他说你的程序运行后就是shell的子进程,子进程修改了工作目录后不会影响父进程。
pwd是linux下的一个命令,用来显示当前工作目录的。
cd那个是shell内置的命令,不是单独的二进制程序。shell相当于解释器,解释了cd的含义,不是父子进程的关系。
作者: allmycheers    时间: 2010-08-04 15:45
哦,懂了,谢了两位。
作者: davelv    时间: 2010-08-04 15:52
要想改变路径。最简单的,你在chdir()函数后面加一个 system("bash");
这样,就回新建一个bash进程,作为你当前进程的子进程,子进程继承了父进程的工作目录,所以你就chdir就生效了。
不过这个bash是新建的,不是原先的shell,要exit命令后才能回到原先的shell,而且工作目录没有受到你新进程的影响。
作者: beyond_touch    时间: 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这个文件存在
作者: davelv    时间: 2010-08-04 16:38
本来是这么回事。但是我发现一件比较疯狂的事居然真的有cd这个文件存在
beyond_touch 发表于 2010-08-04 16:31

我系统下没有这个文件,Fedora Linux 2.6.32
你什么系统?
作者: beyond_touch    时间: 2010-08-04 16:40
回复 10# davelv

OSX 10.6.4
作者: pandaiam    时间: 2010-08-04 16:41
一直以为cd就是个可执行文件的.
难道不是吗..{:3_182:}
作者: beyond_touch    时间: 2010-08-04 16:48
回复 12# pandaiam
正常情况下,cd是shell内置命令
作者: davelv    时间: 2010-08-04 16:55
回复  davelv

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

我一直以为用MAC的人都不屑于使用控制台,以至于我后来都觉得苹果可以把terminal去掉了。。。
你用的什么版本的shell?
作者: pandaiam    时间: 2010-08-04 16:57
哪些是shell内置命令呢?
有啥区分的方法没..

{:3_191:}
作者: beyond_touch    时间: 2010-08-04 16:58
回复 14# davelv


    GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
作者: beyond_touch    时间: 2010-08-04 17:00
回复 15# pandaiam
  1. $ info bash
复制代码

作者: davelv    时间: 2010-08-04 17:01
额。那个cd文件是一个shell脚本吧。。。 --!
作者: beyond_touch    时间: 2010-08-04 17:04
回复 18# davelv
  1. $ cat /usr/bin/cd
  2. #!/bin/sh
  3. # $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
  4. # This file is in the public domain.
  5. builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}
复制代码

作者: davelv    时间: 2010-08-04 17:25
执行此脚本有何结果?
作者: beyond_touch    时间: 2010-08-04 17:29
回复 20# davelv

当然是不起作用啦。我只是偶然发现竟然有一个cd存在。
作者: wijagao    时间: 2010-08-04 17:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: davelv    时间: 2010-08-04 17:36
为什么一个技术贴,被移动到水区了呢?
作者: 漫游云巅    时间: 2012-12-17 22:23
挖坟了,碰到同样的问题。
但上面说的都不对啊,压根不是单独进程的原因。
我添加char bz[128];
然后chdir(buffer);后加入printf("%s\n",getcwd(bz,sizeof(bz)));来测试当前的目录是什么。
结果:
printf("%s\n", buffer);能正常显示是/root(也就是echo $HOME)
但printf("%s\n",getcwd(bz,sizeof(bz)))压根显示的不是echo $HOME,而是本文件的当前目录。
chdir(buffer)这样写压根不对啊。=-1,出错啊。
这和我自己编写的测试chdir的程序一样。
有高手解决下嘛?怎么回事啊?
作者: 漫游云巅    时间: 2012-12-18 12:59
经过“Linux环境编程”区的版主讲解知道了。
要在chdir(buffer)前面加上buffer[strlen(buffer)-1]='\0';这样才能读取这个字符串。
作者: Sevk    时间: 2012-12-18 13:31
提示: 作者被禁止或删除 内容自动屏蔽
作者: windoze    时间: 2012-12-18 15:55
楼主犯的错误当年大牛也犯过

http://cm.bell-labs.com/cm/cs/who/dmr/hist.html






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2