如何将stdout重定向到stdin用于子进程?

时间:2013-01-15 20:49:19

标签: c java-native-interface gpio

自从我使用C以来一直都是这样,所以我为这个简单的问题道歉。

我正在使用armeabi-v7a设备上的GPIO。我需要从Android应用程序中将GPIO接口导出到用户空间,我试图从JNI库中这样做。

要从终端执行此操作,我只需运行echo 199 > /sys/class/gpio/export

但我需要从JNI做到:(

我当前的尝试看起来像这样(有一些错误处理),但不起作用:

JNIEXPORT jboolean JNICALL Java_com_rnd_touchpanel_LED_exportGreen
    (JNIEnv * je, jclass jc)
{
    freopen("/sys/class/gpio/export", "w+", stdout);
    printf("198");
    fclose(stdout);
    return JNI_TRUE;
}

然后我意识到导出实际上是二进制而不仅仅是一个文件,而且我忘记了如何生成新进程并将它们发送给所有这些。有人能刷新我的记忆吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果您只是编写文件,则无需重定向stdout - 只需使用fopen(3)打开文件,使用fprintf(3)写入文件,然后将其关闭{ {1}}。

如果您需要使用其标准的给定数据执行另一个流程,您可以选择以下几个选项:

  • 使用system(3)调用shell并为其提供所需的重定向
  • popen(3)类型fclose(3)"w"数据用于返回的fprintf
  • 使用fork(2)exec*(3)生成新流程。在分叉之后但在执行之前,使用pipe(2)dup2(2)close(2)来适当地设置新进程的标准输入。然后,您可以从父进程写入该文件描述符以设置数据。这是最复杂的选项,但它可以让您最大程度地控制子进程的设置方式。

答案 1 :(得分:1)

我已经做了很多C / C ++,但我相信通过popen完成一个新的过程。例如:

FILE* pOutput = popen("/usr/bin/python myscript.py", "r");
  while ( fgets(line, 199, pOutput) )
  {
    printf("%5d: %s", entry++, line);
  }

如果你在写入模式下打开proc,那么在S / O的另一篇文章中你似乎可以写入popen返回的FILE *:

FILE * file = popen("/bin/cat", "w");
fwrite("hello", 5, file);
pclose(file);