微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux execvp; ls不能访问|,没有这样的文件或目录

我正在尝试编写一个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; }

我们必须使用C“出于性能原因”

如何调用pipe道中的数据的UNIXsorting命令

如何从设备pipe理器获取信息?

SysInternal的WinObj设备列表机制

在Linux和Windows下实现信号?

ls -l | less 实际上ls -l | less是一个shell命令行,它由两个由管道连接的进程组成。 execvp()调用只能产生一个进程。

如果你想从你的程序中这样做,你必须显式调用shell – 或者使用system()调用,或者将命令行改为sh -c 'ls -l | less' sh -c 'ls -l | less' 。 你的word数组应该看起来像这样:

word[0] = "sh" word[1] = "-c" word[2] = "ls -l | less" word[3] = NULL

[编辑]或者,你可以做壳内部做的事情:产生两个进程,并用管道连接它们。 这将涉及使用fork() , pipe() , dup2()和execve()调用。 但是,调用shell的工作量要少得多,因为无论如何都是一个交互式程序,所以不需要太担心性能:任何小于100毫秒的任何事情都被认为是即时的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐