C/C++ - 运行系统("process &"),然后写入其标准

C/C++ - Run system("process &") and then write to its stdin

本文关键字:然后 标准 process C++ 运行系统      更新时间:2023-10-16

我正在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管道(它被称为管道或流吗?):

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

如果需要更多的代码,请告诉我。

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

使用popen(而不是system)打开进程。它将使用一个可以读取或写入(但不能同时读取和写入)的管道创建进程。在你的情况下,你会用"w"为写作。从那里,你可以简单地使用fwrite向进程' stdin '发送数据。

伪代码示例:

FILE * pFile = popen("mplayer -loop 0 /mnt/usb/*", "w");
if(pFile == NULL)
   // Handle error
// Send ">" to process' stdin
const char * psData = ">";
const size_t nDataLen = strlen(psData);
size_t nNumWritten = fwrite(psData, 1, nDataLen, pFile);
if(nNumWritten != nDataLen)
   // Handle error
...
pclose(pFile);
pFile = NULL;

我使用mplayer从属选项和输入作为fifo文件。

使用mkfifo:

创建Linux fifo文件
system("mkfifo /tmp/slpiplay_fifo");

打开播放器:

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

通过fifo:

向mplayer传递"next"命令
system("echo "pt_step 1" >> /tmp/slpiplay_fifo");