为什么';你不允许我用管子吗? #包括 #包括 main() { execlp(“ls”,“ls”,“-l”,“|”,“sort”,NULL); }
怎么了?请帮忙 如果我这样写:为什么';你不允许我用管子吗? #包括 #包括 main() { execlp(“ls”,“ls”,“-l”,“|”,“sort”,NULL); },c,unix,pipe,exec,C,Unix,Pipe,Exec,怎么了?请帮忙 如果我这样写:execlp(“ls”,“ls”,“-l”,NULL)然后结果显示在屏幕上,如果我尝试此execlp(“ls”,“ls”,“l”,“|”,“sort”,NULL)屏幕显示错误消息无法访问 为什么??有人知道吗?为什么它不允许我在执行命令execlp时使用管道()?管道是一个shell构造execlp()不受shell解析的约束;它将参数直接传递给指定的命令。要获取shell功能,需要显式启动shell进程 #include <stdio.h> #incl
execlp(“ls”,“ls”,“-l”,NULL)代码>然后结果显示在屏幕上,如果我尝试此execlp(“ls”,“ls”,“l”,“|”,“sort”,NULL)代码>屏幕显示错误消息无法访问
为什么??有人知道吗?为什么它不允许我在执行命令execlp
时使用管道(
)?管道是一个shell构造execlp()
不受shell解析的约束;它将参数直接传递给指定的命令。要获取shell功能,需要显式启动shell进程
#include <stdio.h>
#include <unistd.h>
main()
{
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
}
在这种情况下,最好指定shell的绝对路径/bin/sh
,这意味着您可以使用execl
,而不是execlp
,管道是一个shell构造execlp()
不受shell解析的约束;它将参数直接传递给指定的命令。要获取shell功能,需要显式启动shell进程
#include <stdio.h>
#include <unistd.h>
main()
{
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
}
在这种情况下,最好指定shell的绝对路径/bin/sh
,这意味着您可以使用execl
,而不是execlp
输出,这会造成混淆exec…
family函数允许执行一个程序来代替调用程序。因此,您的程序只需执行ls
命令,并将“-l”
,“|”
,“sort”
作为参数
以下是它以交互方式提供的内容:
execl("/bin/sh", "/bin/sh", "-c", "ls -l | sort", NULL);
在另一端,然后在shell中正常执行ls-l | sort
,shell将解释
。和外壳:
- 作为第一个命令启动
ls-l
- 作为第二个命令启动
sort
- 第一个命令的输出连接到第二个命令的输入
您可以在fork
、pipe
和execlp
的帮助下明确地完成这项工作,但您必须准备管道,并明确地使用fork才能有两个进程
或者,您可以要求shell执行以下操作:
$ ls "-l" "|" "sort"
ls: sort: No such file or directory
ls: |: No such file or directory
哎呀,你在制造混乱exec…
family函数允许执行一个程序来代替调用程序。因此,您的程序只需执行ls
命令,并将“-l”
,“|”
,“sort”
作为参数
以下是它以交互方式提供的内容:
execl("/bin/sh", "/bin/sh", "-c", "ls -l | sort", NULL);
在另一端,然后在shell中正常执行ls-l | sort
,shell将解释
。和外壳:
- 作为第一个命令启动
ls-l
- 作为第二个命令启动
sort
- 第一个命令的输出连接到第二个命令的输入
您可以在fork
、pipe
和execlp
的帮助下明确地完成这项工作,但您必须准备管道,并明确地使用fork才能有两个进程
或者,您可以要求shell执行以下操作:
$ ls "-l" "|" "sort"
ls: sort: No such file or directory
ls: |: No such file or directory
有一个简单的方法可以做到这一点。它涉及使用函数popen
:
execlp("/bin/sh" , "sh", "-c", "ls -l | sort", NULL);
#包括
#包括
int main(){
FILE*out=popen(“ls-l | sort”,“w”);
pclose(out);
返回0;
}
但是,它可能不是您想要的,因为它不使用exec。有一种简单的方法可以做到这一点。它涉及使用函数popen
:
execlp("/bin/sh" , "sh", "-c", "ls -l | sort", NULL);
#包括
#包括
int main(){
FILE*out=popen(“ls-l | sort”,“w”);
pclose(out);
返回0;
}
但是,这可能不是您想要的,因为在shell中编写以下命令时,它不使用exec。
#include <stdio.h>
#include <unistd.h>
int main() {
FILE* out = popen("ls -l | sort", "w");
pclose(out);
return 0;
}
执行两个程序:ls
和sort
管道字符(|
)表示第一个管道的输出应重定向到第二个管道的标准输入。此管道由shell解释。它不是命令的参数
将程序名及其参数作为参数
所以当你写作的时候
ls -l | sort
它没有任何意义,因为|
和排序
不是ls
的参数
您想要做的是shell为您做的事情:
申报
制作一个分叉,将stdout重定向到管道(使用),并执行ls
:
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
制作一个分叉,将管道重定向到stdin并执行sort
:
execlp("ls" , "ls", "-l", NULL);
关上你的烟斗,等等
在shell中编写以下命令时
#include <stdio.h>
#include <unistd.h>
int main() {
FILE* out = popen("ls -l | sort", "w");
pclose(out);
return 0;
}
执行两个程序:ls
和sort
管道字符(|
)表示第一个管道的输出应重定向到第二个管道的标准输入。此管道由shell解释。它不是命令的参数
将程序名及其参数作为参数
所以当你写作的时候
ls -l | sort
它没有任何意义,因为|
和排序
不是ls
的参数
您想要做的是shell为您做的事情:
申报
制作一个分叉,将stdout重定向到管道(使用),并执行ls
:
execlp("ls" , "ls", "-l", "|" , "sort", NULL);
制作一个分叉,将管道重定向到stdin并执行sort
:
execlp("ls" , "ls", "-l", NULL);
关上你的烟斗,等等
因为sort是一个不同的程序。@purpletech你是什么意思?你能简单解释一下吗?“ls”和“sort”是两个程序。execlp的第一个参数只能处理一个程序。基本上,它用你在第一个参数中提到的这个新程序覆盖内存,并传递你提到的参数。因为sort是一个不同的程序。@purpletech什么意思?你能简单解释一下吗