簡體   English   中英

C / C ++-運行system(“ process&”),然后寫入其標准輸入

[英]C/C++ - Run system(“process &”) and then write to its stdin

我正在Linux和C / C ++上工作。 我編寫了一個帶有一些線程(#include pthread.h)的程序,並使用sudo運行它。

一個線程運行一個進程(mplayer),並通過添加“&”使其保持運行狀態,以便system()可以快速返回。

system("mplayer -loop 0 /mnt/usb/* &");

mplayer進程正常運行,並按預期播放音樂。

之后,我通過運行pidof獲得其進程ID。 假設它返回2449。posix互斥鎖用於在該線程和第二個線程上寫入/讀取該進程ID。

在第二個線程上,我嘗試使用/ proc / 2449 / fd / 0管道(將其稱為管道還是流?)將數據寫入mplayer:

system("echo \">\" > /proc/2499/fd/0");

system()返回0,但是mplayer進程什么也沒得到。 “>”命令應播放下一首曲目。

stdin流是否被其他進程繼承?

在2449進程下列出了多個fd,stdin流中是否是其中之一(除0外)?

root@pisanlink:/proc# cd 2499
root@pisanlink:/proc/2499# cd fd
root@pisanlink:/proc/2499/fd# ls
0  1  2  3  4  5  7
root@pisanlink:/proc/2499/fd# 

我還嘗試了另一種方法...我使用具有寫權限的popen()。 我嘗試使用fprintf發送命令,但是mplayer似乎也沒有收到任何東西。

如果需要更多代碼,請告訴我。

任何提示將不勝感激。 謝謝。

使用popen (不是系統)打開進程。 它將使用您可以讀取或寫入(但不能同時讀取和寫入)的管道創建流程。 對於您的情況,您可以使用“ w”打開它進行編寫。 從那里,您可以簡單地使用fwrite將數據發送到進程的stdin。

偽代碼示例:

FILE * pFile = popen("mplayer -loop 0 /mnt/usb/*", "w");

if(pFile == NULL)
   // Handle error

// Send ">" to process' stdin
const char * psData = ">";
size_t nNumWritten = fwrite(psData, 1, strlen(psData), pFile);

if(nNumWritten != 1)
   // Handl error

...

pclose(pFile);
pFile = NULL;

我使用mplayer slave選項和輸入作為fifo文件。 它工作正常。

使用mkfifo創建Linux fifo文件:

system("mkfifo /tmp/slpiplay_fifo");

使用以下命令打開mplayer:

system("mplayer -slave -idle -really-quiet -input file=/tmp/slpiplay_fifo /mnt/usb_slpiplay/* &");

使用fifo將“ next”命令傳遞給mplayer:

system("echo \"pt_step 1\" >> /tmp/slpiplay_fifo");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM