Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';你不允许我用管子吗? #包括 #包括 main() { execlp(“ls”,“ls”,“-l”,“|”,“sort”,NULL); }_C_Unix_Pipe_Exec - Fatal编程技术网

为什么';你不允许我用管子吗? #包括 #包括 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什么意思?你能简单解释一下吗