#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
char *buffer = malloc(1024);
FILE* f = popen("ls", "r");
int byteReads = fread(buffer, 1, 1024, f);
fclose(f);
printf("%s\n", buffer);
return 0;
}
这是2个文件夹./parent/folder1
和./parent/folder2
。 ./main
在文件夹1中,我希望它在文件夹2中执行ls
并获取结果。
不是特定于“ ls”的东西,但通常适用于所有命令。
如何使用popen()
来完成?还是我必须使用其他命令?
您可以在问题中使用popen。您可以将要执行的cmd作为参数传递给程序调用,例如如果您的程序名为myexecute
,则命令行调用将如下所示:
myexecute folder2 'ls -l'
或
myexecute 'another folder' 'ls'
如果参数中包含空格,请注意单引号以获取参数。
使用chdir
,您可以更改当前工作目录。可以在循环中读取命令的输出并将其输出到stdout。最后,使用pclose,您将等待关联的进程完成,甚至会返回已执行命令的退出状态,以防万一。
您经过稍微修改的代码可能看起来像这样:
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
if(argc != 3) {
fprintf(stderr, "usage: %s '<dir>' '<cmd>'\n", basename(argv[0]));
return EXIT_FAILURE;
}
if(chdir(argv[1]) != 0) {
perror(argv[1]);
return EXIT_FAILURE;
}
FILE *f = popen(argv[2], "r");
if (!f) {
perror("popen failed");
return EXIT_FAILURE;
}
char buf[1024];
while (fgets(buf, sizeof(buf), f)) {
printf("%s", buf);
}
if (pclose(f) != 0) {
perror("pclose failed");
}
return EXIT_SUCCESS;
}