C/C++ - 运行系统("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管道(它被称为管道或流吗?):
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");
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 流对象来表示文件输入,然后是标准输入?
- 根据标准对结构向量进行排序,然后显示结果
- 标准选择1st,然后选择2nd
- 如何从文件输入,然后在c++中同时使用标准i/o流
- C/C++ - 运行系统("process &"),然后写入其标准