如何制作';cd&x27;从我自己的自定义shell命令工作?
我目前正在做UNIX(LINUX)编程的家庭作业。 我被指派构建自己的定制shell,所有常用的linux命令和定制程序都可以工作 我还创建了如何制作';cd&x27;从我自己的自定义shell命令工作?,c,linux,shell,system-calls,C,Linux,Shell,System Calls,我目前正在做UNIX(LINUX)编程的家庭作业。 我被指派构建自己的定制shell,所有常用的linux命令和定制程序都可以工作 我还创建了my_ls,my_cp,my_rm,my_cd,以检查linux命令和我自己的命令是否都有效 下面是一个简单的故事 /myOwnShell//运行我自己的shell 主页/测试文件夹>>ls.//Shell提示符 a、 out helloWorld.txt myOwnShell.c myOwnShell//打印ls命令的结果 主页/测试/文件夹>>我的/运
my_ls
,my_cp
,my_rm
,my_cd
,以检查linux命令和我自己的命令是否都有效
下面是一个简单的故事
/myOwnShell//运行我自己的shell
主页/测试文件夹>>ls.//Shell提示符
a、 out helloWorld.txt myOwnShell.c myOwnShell//打印ls命令的结果
主页/测试/文件夹>>我的/运行我自己的ls命令程序
a、 out helloWorld.txt myOwnShell.c myOwnShell
到目前为止,所有的linux命令(在/bin/中)和我自己的命令(在home//bin/中)都有效。
但当我键入cd
和my_cd
时,它会有所不同,这会改变当前的cwd
home/testFolder>>cd ..
Fail to run program // Error message from exec function failure
home/testFolder>>my_cd ..
// No message but also cwd is not changed
home/testFolder>> // Prompt from same folder
下面是myShell程序的一些伪源代码
(我无法复制/粘贴我的源,因为它位于大学服务器中,传输协议被阻止)
intmain(){
char**res;//通过标记存储命令
而(1){
printf(“%s>>”,cwd);
get(in);//get命令
//
//res=[“ls”,“/文件夹”,NULL]>
pid=fork();
如果(pid==0){//child
如果(execvp(res[0],res)=-1){//运行'ls'命令
printf(“无法运行程序”);
退出(0);//退出子进程
}
}否则{//Parent,在fork失败的情况下省略
等待(0);
//省略退出状态检查代码
}
}
返回0;
}
Commandcd
是linux内置的命令,
Commandmy_cd
是我自己的程序,可以更改它的cwd
我知道更改子进程的cwd不会影响父进程,这就是为什么“cd”不会更改shell的cwd。我发现cd
命令不在/bin/
中,所以我猜cd
是在linux shell中编码的
我怎样才能让它工作
cd
my_cd
——我没有它的源代码,只有程序。这是我的教授寄来的cd
无法实现,除非它是在shell本身中编码的。但教授给了我这个家庭作业,这可能意味着这是可能的
有什么想法吗?研究一些现有开源shell的源代码,例如,或,然后查看。另请阅读
cd
命令是一个特殊的内置命令-它不执行外部二进制文件(即使POSIX系统上存在/bin/cd
或/usr/bin/cd
中的一个)。如果您真的在编写自己的shell,那么当前目录只是它的一个内部状态。因此,您的cd
只需对其进行更改即可。我收回它-cd
不是POSIX中的特殊内置项-;它只是一个实用工具()。但是,它通常是内置的,因为它必须影响当前进程的当前目录,而执行的命令不能这样做。@JonathanLeffler这是否意味着cd是驻留在/bin中的程序?我在/bin中找不到“cd”程序。
int main() {
char** res; // store command by tokening
while (1) {
printf("%s>>", cwd);
gets(in); // get command
// <Some codes that split `in` by space and store it into res>
// <If cmd is "ls ./folder" -> res = ["ls", "./folder", NULL]>
pid = fork();
if (pid == 0) { // child
if (execvp(res[0], res) == -1) { // Run 'ls' command
printf("Fail to run program");
exit(0); // Exit child process
}
} else { // Parent, I omit in case of fork failure
wait(0);
// Omit exit status checking code
}
}
return 0;
}