(小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
2012-03-08 16:31
399 查看
熟悉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。
/article/11284333.html
在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。
/article/11284333.html
相关文章推荐
- (小常识)为什么程序中不能使用system("cd ..")来改变pwd(present working directory)
- 为什么linuxC程序设计中不能使用system("cd ..")来改变当前工作路径而用chdir()函数
- 使用VS2003创建WEB程序的时候出现"AutoMation服务器不能创建对象"错误
- photoshop中为什么会出现"不能使用文字工具,因为暂存盘已满"?
- 用1、2、3、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列 要求:"4"不能在第三位,"3"与"5"不能相连。
- CString 不能使用_T("%hs")这种Format
- 为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号
- ORA-01017 invalid username/password;logon denied",system用户不能以nomal方式登陆
- 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义必须添加对程序集“System.Data.Entity"引用
- zendframework搭建为什么cmd窗口是这样的,"php.exe"' 不是内部或外部命令,也不是可运行的程序
- 显示 “0x004011a0"指令引用的“0 x00000000"内存。该内存不能为‘read". 要终止程序...
- 使用exe程序加密解密,web.config时出错 ”Unable to save config to file...."
- 小程序为什么脚本内不能使用window等对象
- 关于“此程序集中已使用了资源标识符 "Test.Searchn.resources”问题的解决办法
- 解决错误"不能添加其键已在使用中的实体"
- Android emulator 的控制按钮不能使用并显示 "hardware buttons not enabled in avd"
- 获得程序当前路径System.getProperty("user.dir")
- 为什么有的程序不能设断点?(解答)丹丹&亚丽
- 【Unity&UGUI】代码控制Toggle,为什么不能使用Toggle
- 【C#】不能像使用方法那样使用不可调用的成员"System.Data.DataSet.Tables".