c - 如何将子进程的标准输出重定向到标准输入?

标签 c java-native-interface gpio

我已经很久没用过 C 了,所以对于这个简单的问题我深表歉意。

我正在 armeabi-v7a 设备上使用 GPIO。我需要从 Android 应用程序中将 GPIO 接口(interface)导出到用户空间,我正在尝试从 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;
}

然后我意识到导出实际上是二进制的,而不仅仅是一个文件,而且我忘记了如何生成新进程并向它们发送输入等等。有没有人可以唤醒我的内存?谢谢!

最佳答案

如果你只是在写一个文件,没有必要重定向 stdout -- 只需用 fopen(3) 打开文件,用 fprintf(3) 写入它,并使用 fclose(3) 关闭它。

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

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

关于c - 如何将子进程的标准输出重定向到标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346650/

相关文章:

c - 如何在 C 中调试 Vigenere 密码?

c - 段错误 - fclose/fopen

java - JNI 库在垃圾回收时释放内存?

javascript - 我的 Node.js 应用程序的 react 速度很慢

python - RPi.GPIO 中断调用函数的时间不够长

c - 神秘的 getenv() 段错误

c++ - CFLAGS 并分配多个引用?

Java System.load(libName) 查找错误的库名称

java - NewStringUTF 是否复制传入的 const char *

c++ - 创建对所有对象都相同的属性