我正在尝试编写
shell.但是我的
shell没有执行命令 – ls -l |减.我正在使用execvp.代码如下.
#include <stdio.h> #include <unistd.h> #include <string.h> int main(){ int pid,status,num,len; char str[1000],cwd[100]; char* word[100]; getcwd(cwd,sizeof(cwd)); while(1){ chdir(cwd); printf("%s > ",cwd); gets(str); pid=vfork(); if(pid == 0){ num = 0; word[num] = strtok (str," "); while (word[num] != NULL) { word[num] = strdup (word[num]); len = strlen (word[num]); if (strlen (word[num]) > 0) if (word[num][len-1] == '\n') word[num][len-1] = '\0'; word[++num] = strtok (NULL," "); } if(strcmp(word[0],"cd") == 0){ chdir(word[1]); getcwd(cwd,sizeof(cwd)); } else{ execvp(word[0],word); } exit(0); } else{ wait(&status); } } return 0; }
解决方法
ls -l | less实际上是一个shell命令行,它由两个由管道连接的进程组成. execvp()调用只能生成一个进程.
如果要从程序中执行此操作,则必须显式调用shell – 通过使用system()调用或将命令行更改为sh -c’ls -l |减’.你的单词数组应如下所示:
word[0] = "sh" word[1] = "-c" word[2] = "ls -l | less" word[3] = NULL
[编辑]或者,您可以执行shell在内部执行的操作:生成两个进程并使用管道连接它们.这将涉及使用fork(),pipe(),dup2()和execve()调用.但是,调用shell的工作量要少得多,而且因为交互式程序的数量较少,所以不需要担心性能太高:任何时间不到100毫秒的东西都被认为是瞬时的.
原文地址:https://www.jb51.cc/linux/393272.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。