linux execvp; ls无法访问|,没有这样的文件或目录
发布时间:2020-05-24 11:04:02 所属栏目:Linux 来源:互联网
导读:我正在尝试编写 shell.但是我的 shell没有执行命令 – ls -l |减.我正在使用execvp.代码如下. #include stdio.h#include unistd.h#include string.hint main(){ int pid, status, num, len; char str[1000], cwd[100]; cha
|
我正在尝试编写 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] = ' ';
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毫秒的东西都被认为是瞬时的. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- linux – 我的DNS服务器正在推动20mbps,为什么?
- linux – 如何删除文件最后一行的最后一个字符?
- linux – Nginx Php5-fpm无法呈现php文件
- LINUX实操:Ubuntu 16.04 LTS Django虚拟开发环境配置
- SCHED_FIFO线程被Linux中的SCHED_OTHER线程抢占
- 使用和不使用Scatter / Gather操作进行零拷贝
- 如何在Linux上自行完成相当于Synology Hybrid Raid的操作?
- linux – 通过UDP或TCP隧道
- vlan – tc u32 – 如何在最近的内核中匹配L2协议?
- 使用来自Line IN的ALSA录制声音
