如何获取execv | | execl运行一个程序或另一个管道的参数

如何获取execv | | execl运行一个程序或另一个管道的参数,c,C,好吧,我不想传递参数,我知道,但我正在试图弄清楚如何从终端传递这些参数,你从哪里学到这些 int main(int argc, char **argv) { int infd, outfd, bytes; char buf[SIZE]; //I WILL READ FILES HERE while((bytes = read(infd, buf, SIZE)) > 0) { write(outfd, buf, bytes);

好吧,我不想传递参数,我知道,但我正在试图弄清楚如何从终端传递这些参数,你从哪里学到这些

int 
main(int argc, char **argv) {

    int infd, outfd, bytes;
    char buf[SIZE];

    //I WILL READ FILES HERE 
    while((bytes = read(infd, buf, SIZE)) > 0) {
        write(outfd, buf, bytes);
    }

    int fd[2];
    if (pipe(fd) == -1) return 1;

    int pid1 = fork();
    if (pid1 < 0) return 2; 

    if (pid1 == 0) {
        dup2(fd[0], STDIN_FILENO);
        close(fd[0]);
        close(fd[1]);
        execvp("How do i take arguments here?");
        // Example, I am showing an example with execl but i would like to use execv
        // Assuming wcat is my written program. Am writing wcat in another file? or 
        // can i call the wcat function if wcat was as an argument? I tried something like below
        // Note: that i tried :
        /*
            execlp("./wcat", argv[1], argv[2], argv[3]); but this does nothing 
        */
        execlp("wcat", "wcat", "file1", "file2", "file3", NULL);
        if ((strcmp(argv[0], "wcat"), 0)) { // i did this but nope 
            // do something
        }
    }

    int pid2 = fork();
    if (pid2 < 0) return 3;

    if (pid2 == 0) {
        dup2(fd[2], STDIN_FILENO);
        close(fd[0]);
        close(fd[1]);
        execvp("How do i take arguments here?");
        // Note: that i tried :
        /*
            execlp("./ww", argv[1], NULL); but this does nothing 
        */
        if ((atoi(argv[1], "pass integer here"), 0)) { // i did this but nope 
            // do something
        }
        // Example, I am showing an example with execl but i would like to use execv
        execlp("use my word-wrap program", " pass second arguments as an integere");
    }
 // you have to close the both file descriptors for the program to end
    close(fd[0]);
    close(fd[1]);
    // calling waitpid for fd[1] to work before starting fd[2]
    waitpid(pid1, NULL, 0);
    waitpid(pid2, NULL, 0);
    return 0;
}
int
主(内部argc,字符**argv){
int infd,outfd,字节;
字符buf[大小];
//我将在这里阅读文件
而((字节=读取(infd,buf,SIZE))>0){
写入(OUPD、buf、字节);
}
int-fd[2];
如果(管道(fd)=-1)返回1;
int-pid1=fork();
if(pid1<0)返回2;
如果(pid1==0){
dup2(fd[0],标准文件号);
关闭(fd[0]);
关闭(fd[1]);
execvp(“我如何在这里接受论点?”);
//示例,我展示了一个使用execl的示例,但我想使用execv
//假设wcat是我编写的程序。我正在另一个文件中编写wcat?或
//如果wcat作为参数,我可以调用wcat函数吗?我尝试了以下方法
//注意:我试过:
/*
execlp(“./wcat”,argv[1],argv[2],argv[3]);但这不起任何作用
*/
execlp(“wcat”、“wcat”、“文件1”、“文件2”、“文件3”,NULL);
如果((strcmp(argv[0],“wcat”),0)){//我这样做了,但没有
//做点什么
}
}
int-pid2=fork();
if(pid2<0)返回3;
如果(pid2==0){
dup2(fd[2],标准文件号);
关闭(fd[0]);
关闭(fd[1]);
execvp(“我如何在这里接受论点?”);
//注意:我试过:
/*
execlp(“./ww”,argv[1],NULL);但这不起任何作用
*/
如果((atoi(argv[1],“此处传递整数”),0)){//我这样做了,但没有
//做点什么
}
//示例,我展示了一个使用execl的示例,但我想使用execv
execlp(“使用我的word包装程序”,“将第二个参数作为整数传递”);
}
//必须关闭两个文件描述符才能结束程序
关闭(fd[0]);
关闭(fd[1]);
//在启动fd[2]之前为fd[1]调用waitpid使其工作
waitpid(pid1,NULL,0);
waitpid(pid2,NULL,0);
返回0;
}
我想在终端上运行此命令:
/wcat file1 file2 file3 |/ww 50

请记住,任何知识都会有帮助。我的其他程序都完成了。我只需要在终端上运行它,我可以在文件中传递参数,这很好,但我想在终端上运行它。

execlp
接受数量可变的参数,类型为
const char*
以NULL结尾:

execlp("./wcat", "./wcat", "first arg", "second arg", NULL);
实际问题是,您希望执行
execlp()
调用之后的代码。由于您指定的程序现在正在运行,它将不起作用:

#include <stdio.h>
#include <unistd.h>

int main() {
    execlp("/bin/bash", "/bin/bash", "-c", "echo hello", 0);
    printf("world\n");
    return 0;
}

execlp
接受类型为
const char*
的可变数量的参数,以NULL结尾:

execlp("./wcat", "./wcat", "first arg", "second arg", NULL);
实际问题是,您希望执行
execlp()
调用之后的代码。由于您指定的程序现在正在运行,它将不起作用:

#include <stdio.h>
#include <unistd.h>

int main() {
    execlp("/bin/bash", "/bin/bash", "-c", "echo hello", 0);
    printf("world\n");
    return 0;
}

当您尝试执行时(“/wcat”,argv[1],argv[2],argv[3]),是确切的,还是您确实记得最后一个
(char*)NULL
?对不起,没有,我的最后一个参数是NULL。我只是想举个例子,但忘了在结尾处加NUll。我会在程序上尝试
strace-f
,以缩小失败的
execlp
。注意,如果第一个参数包含类似于
“/wcat”的斜杠,然后,
exec
系列在名称中使用和不使用
p
时的功能基本相同。如果它是一个没有斜杠的普通名称,比如
“wcat”
,那么
p
函数包括
execlp
execvp
将显示在
$PATH
中,但是
可能不在
$PATH
中。没有
p
的函数将在当前目录中查找。您是否阅读了
execvp
的手册页?您不明白的是什么?当您尝试
execlp(“./wcat”、argv[1]、argv[2]、argv[3])
时,到底是这样的,还是您真的记得最后一个
(char*)NULL
?对不起,没有,我的最后一个参数是NULL。我只是想举个例子,但忘了在结尾处加NUll。我会在程序上尝试
strace-f
,以缩小失败的
execlp
。注意,如果第一个参数包含类似于
“/wcat”的斜杠,然后,
exec
系列在名称中使用和不使用
p
时的功能基本相同。如果它是一个没有斜杠的普通名称,比如
“wcat”
,那么
p
函数包括
execlp
execvp
将显示在
$PATH
中,但是
可能不在
$PATH
中。没有
p
的函数将在当前目录中查找。您是否阅读了
execvp
的手册页?您不明白的是什么?是不是。/wcat将是第一个argv[0],然后argv[1]是文件1?第一个“wcat”是正在执行的程序,第二个是正在传递给程序的argv[0]参数(afaik)。
execlp(“wcat”,argv[0],…)
将在
$PATH
上运行一个程序
wcat
,并告诉它该程序是使用与当前程序相同的名称调用的
execlp(argv[0],…)
很可能从一开始就以递归方式再次运行当前程序。@aschepper很好,它的性能完全符合我测试它时的预期。它执行path并将第一个参数作为argv[0]传递给程序。下面是手册页中关于arg的内容:“按照惯例,第一个参数应该指向与正在执行的文件相关联的文件名。”非常感谢。我真的很感激。我对一件事感到困惑,那就是我的程序wcat在一个文件中,ww在另一个文件中。我该如何调用此文件并运行。/wcat file1 file2 file3 |。/ww 50?