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

标签 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进程没有得到任何东西。 ">"命令应播放下一首轨道。

标准输入流是否被其他进程继承?

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 (不是系统)打开进程。它将创建带有管道的进程,您可以从中读取或写入(但不能同时读取和写入)。在你的情况下,你可以用“w”打开它进行写入。从那里您可以简单地使用 fwrite 将数据发送到进程的标准输入。

伪代码示例:

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;

关于c++ - C/C++ - 运行系统 ("process &"),然后写入其标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22430942/

相关文章:

c++ - 离开方法时重置变量值

c++ - 从友元函数中的对象访问成员函数

c - 带十六进制负值的 sscanf

Linux 恢复删除的目录

linux - Bash:如何更改文件的第一列并且仅更改第一列

php - 进程正在运行,但我找不到它

c++ - 在 C++ 中存储、加载和使用倒排索引的最佳方式 (~500 Mo)

c++ - 检查鼠标是否在旋转的 Sprite 上方? C++

使用c编程中的函数计算2个坐标之间的距离(x,y,z)

c - 当我无法进入函数时这意味着什么? [C]