如何获取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?