C / C ++ - 运行系统(“process&”)然后写入其stdin

时间:2014-03-15 23:12:29

标签: c++ c linux multithreading 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,其中一个(除了0)stdin流?

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似乎也收不到任何东西。

如果需要更多代码,请告知我们。

任何提示都将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

使用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;

答案 1 :(得分:-1)

我使用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");