【发布时间】:2014-03-15 23:12:28
【问题描述】:
我正在研究 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 似乎也没有收到任何内容。
如果需要更多代码,请告诉我。
任何提示将不胜感激。谢谢。
【问题讨论】:
-
man 3 popen可能更适合您的总体目标。在echo上使用 system() 似乎特别迂回。 -
使用
popen,您需要在向其打印命令后将FILE设置为行缓冲或非缓冲模式(请参阅:setvbuf)或fflush。跨度> -
你可以查看 mplayer 的 -slave 选项,然后通过 popen 返回的 FILE 继续发送命令。
-
@ChrisStratton:是的,我不应该像使用 shell 一样编程,但我只是从这个开始。
-
对了,有人能告诉我为什么进程下有这么多打开的fd吗? 0 1 2 3 4 5 7
标签: c++ c linux multithreading stdin