【发布时间】:2017-07-18 23:35:26
【问题描述】:
我想使用 c 代码从我的脚本中获取返回值。 考虑到我的脚本在另一个分区中,我正在挂载该分区并且我正在调用,
value=system("./mnt1/myscript.img");
我需要 myscript.img 文件中的一个函数,它应该返回一个值(例如:mmcpart) 我如何构建脚本以获取返回值。谁能帮我解决这个问题。 提前致谢。
【问题讨论】:
我想使用 c 代码从我的脚本中获取返回值。 考虑到我的脚本在另一个分区中,我正在挂载该分区并且我正在调用,
value=system("./mnt1/myscript.img");
我需要 myscript.img 文件中的一个函数,它应该返回一个值(例如:mmcpart) 我如何构建脚本以获取返回值。谁能帮我解决这个问题。 提前致谢。
【问题讨论】:
您可以将shell脚本的输出写入一个文件,并从C程序中读取文件内容。
只有在 shell 脚本进程完成后,您的 C 程序才必须尝试读取文件,最好使用 $? = 0。
你可以把你的shell脚本文件名放在.profile文件中,它会自动执行你的shell脚本。
Shell 脚本编程拥有强大的文件处理命令,写入文件应该不是问题。
不确定为什么要使用 **tee ** 命令。您是否也希望将输出发送到 STDOUT?
【讨论】:
您真正需要的是一个管道,然后是 fork 和 execvp,您可以在其中执行您的脚本。像这样的东西应该适合你
int mypipe[2];
if(pipe(mypipe) == -1) {
perror("Pipe creation failed");
exit(1);
}
if(fork() == 0) //first fork
{
close(STDOUT_FILENO); //closing stdout
dup(mypipe[1]); //replacing stdout with pipe write
close(mypipe[0]); //closing pipe read
close(mypipe[1]);
const char* myprog[] = { "ps", "-ef", 0};
execvp(myprog[0], myprog);
perror("error in execvp for ps command");
exit(1);
}
char str[200];
FILE* fp = fdopen(mypipe[0], "r");
while (fgets(str, 200, fp) != 0) {
printf("%s\n", str);
}
【讨论】:
fork() 失败时,此答案无法解释。相反,它假定调用是成功的。