Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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
如何在C中执行命令并读取其输出_C_Unix_System_Execv - Fatal编程技术网

如何在C中执行命令并读取其输出

如何在C中执行命令并读取其输出,c,unix,system,execv,C,Unix,System,Execv,我想使用以下命令查找路径名: system("which"); 然后我使用输出作为execv()函数的参数。我该怎么做?有什么建议吗 您试图以错误的方式解决它它使用路径变量来定位给定的可执行文件。使用which获取路径,然后将其传递给execv()是不必要的,因为exec*还有另一个变体,它的作用相同: 要读取命令的输出,可以使用: #包括 #包括 字符str[LINE_MAX]; FILE*fp=popen(“哪个ls”、“r”); 如果(fp==NULL){ /*错误*/ } if(fg

我想使用以下命令查找路径名:

system("which");

然后我使用输出作为
execv()
函数的参数。我该怎么做?有什么建议吗

您试图以错误的方式解决它
它使用
路径
变量来定位给定的可执行文件。使用
which
获取路径,然后将其传递给
execv()
是不必要的,因为
exec*
还有另一个变体,它的作用相同:


要读取命令的输出,可以使用:

#包括
#包括
字符str[LINE_MAX];
FILE*fp=popen(“哪个ls”、“r”);
如果(fp==NULL){
/*错误*/
}
if(fgets(str,sizeof str,fp)==NULL){
/*错误*/
}
/*删除尾随的换行符(如果有)*/
char*p=strchr(str,'\n');
如果(p)*p=0;

如果您的二进制文件在某个缓冲区中,那么您可以使用
snprintf()
来形成
popen()

的第一个参数,不要使用
system
而是
popen
。但是我必须使用system@Jean-BaptisteYunèsy您无法轻松获得
system
运行的命令在输出时产生的内容,这并不是用于此目的。为什么要用这种方式定位it?让
execvp
为您完成这项工作……您可以解析env
路径,而不是使用
which
。使用
strtok()
,获取每个路径,并检查从
path
提取的每个路径中是否存在命令。或者使用
execvpe()
execle()
并传递环境,其中包括
PATH
。这是一个编程助手,我必须使用which和execv()Hmm。如果你真的想这样做,你可以使用
popen()
fgets()
@esrtr-如果你坚持使用
system()
其中的
,必须在子进程和父进程之间创建管道。将子进程的
stdout
设置为管道的写入端。在父进程上,从管道读取以获得
哪个cmd
的输出。现在,通过这个输出,您可以调用
execvp()
。我可以使用system()。不是popen()。我该怎么做?可能吗@l3x@esrtr你的要求不同寻常<代码>系统()。你可以照阿尔维茨的建议去做。
#include <limits.h>
#include <stdio.h>


char str[LINE_MAX];
FILE *fp = popen("which ls", "r");

if (fp == NULL) {
   /* error */
}

if(fgets(str, sizeof str, fp) == NULL) {
   /* error */
}

/*remove the trailing newline, if any */
char *p = strchr(str, '\n');
if (p) *p = 0;