2013-01-15 140 views
0

自從我使用C以來,我一直保持這種狀態,所以我爲這個簡單的問題表示抱歉。如何將stdout重定向到一個子進程的stdin?

我在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; 
} 

我才明白,出口實際上是二進制的不只是一個文件,我已經忘記了如何生成新的進程和發送它們的輸入和所有可能有人告訴我一次感謝

012?!

回答

2

如果你只是寫一個文件,不需要重定向stdout - 只需打開文件fopen(3),用fprintf(3)寫入,然後用fclose(3)關閉它。

如果您需要在其標準中給出的數據來執行另一個過程中,你有幾種選擇:

  • 使用system(3)來調用外殼,並給它所需的重定向
  • 使用popen(3)"w"型和fprintf將您的數據返回到FILE*
  • 使用fork(2)exec*(3)產生新過程。分叉之後,但在執行之前,請使用pipe(2),dup2(2)close(2)正確設置新進程的標準輸入。然後您可以從父進程寫入該文件描述符來設置數據。這是最複雜的選項,但它使您能夠最有效地控制子進程的設置。
+0

謝謝!叉路線是我想到的,但不記得如何寫! – FlyingStreudel

1

這已經有一段時間了,我已經做了很多的C/C++,但我相信產生一個新的過程是通過popen完成的。例如:

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

從S上另一篇文章/ O似乎你可以寫,如果你打開寫模式PROC通過POPEN返回FILE *:

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