(小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
2005-08-23 10:08
483 查看
熟悉Unix编程的人都知道,在<stdlib.h>中声明的函数system是用来在程序中调用shell命令的方法。例如你可以在程序中写一行system("rm *");这相当于你在命令行下敲rm *,但是cd命令却不能用system来做的。一般,你要改变程序的pwd,你都必须用函数chdir(const char*),它在<unistd.h>中声明。为什么呢?请看下面这段程序:
在Unix/Linux下你可以编译运行它
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("out/n");
printf("-----------------------------------------/n");
system("cd ../npwd");
printf("-----------------------------------------/n");
printf("out/n");
system("pwd");
}
你会惊奇的发现,两次system调用pwd命令后,在屏幕上的输出不同。在我的机器上,可执行文件位于/home/chensj下,输出如下:
out
-----------------------------------------
/home
-----------------------------------------
out
/home/chensj
这说明了什么呢?
根据shell的实现机制,我认为system内部实现,实际上是派生了程序的一个子进程,该子进程跟程序的父进程相同,都是shell进程,然后它将命令行参数传给这个子shell,子shell执行了cd命令后改变了自己的pwd为/home,之后又执行pwd输出为/home,随后消亡。而程序的pwd则决定于它的父shell进程的pwd,它没有变,所以第二次调用system("pwd")输出仍然为/home/chensj。
在Unix/Linux下你可以编译运行它
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("out/n");
printf("-----------------------------------------/n");
system("cd ../npwd");
printf("-----------------------------------------/n");
printf("out/n");
system("pwd");
}
你会惊奇的发现,两次system调用pwd命令后,在屏幕上的输出不同。在我的机器上,可执行文件位于/home/chensj下,输出如下:
out
-----------------------------------------
/home
-----------------------------------------
out
/home/chensj
这说明了什么呢?
根据shell的实现机制,我认为system内部实现,实际上是派生了程序的一个子进程,该子进程跟程序的父进程相同,都是shell进程,然后它将命令行参数传给这个子shell,子shell执行了cd命令后改变了自己的pwd为/home,之后又执行pwd输出为/home,随后消亡。而程序的pwd则决定于它的父shell进程的pwd,它没有变,所以第二次调用system("pwd")输出仍然为/home/chensj。
相关文章推荐
- (小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
- 为什么linuxC程序设计中不能使用system("cd ..")来改变当前工作路径而用chdir()函数
- photoshop中为什么会出现"不能使用文字工具,因为暂存盘已满"?
- 使用VS2003创建WEB程序的时候出现"AutoMation服务器不能创建对象"错误
- [Phonegap+Sencha Touch] 移动开发39 某些安卓手机的webview使用location.href="tel:123456"不能调到打电话的界面
- IIS7.0+was 托管使用"NetTcpBinding"等会话服务的wcf程序
- 【Unity&UGUI】代码控制Toggle,为什么不能使用Toggle
- 对String s = "11.1,56.1,2.9,34.3,1.03,24.2" 不能使用jdk自带排序方法
- vs2005 "automation服务器不能创建对象"解决方法. -- 安装好VS2005 SP1为什么还是不能创建WEB文件
- 使用VS2010在项目中编写C++头文现出"PCH 警告:标头停止点不能位于宏或#if块中"
- 为什么判断UITextField判断为空不能用isEqualToString:@""
- scanf("%c", &c);这句不能正常接收字符的原因。(附strindex的实现程序)
- 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 overrideMode="Deny"
- system ("pause")这句话在编译的时候为什么无法通过?
- 使用了<input type="submit" value="Submit" onclick="this.disabled=true" />不能提交
- win7 IIS7 "另一个程序正在使用此文件,进程无法访问" 解决方法
- zendframework搭建为什么cmd窗口是这样的,"php.exe"' 不是内部或外部命令,也不是可运行的程序
- 为什么不能直接通过document.getElementById("<%= txtCard.ClientID %>")
- Android emulator 的控制按钮不能使用并显示 "hardware buttons not enabled in avd"
- c程序中不使用分号输出"Hello, world"