Я работаю над Linux и C/C++. Я написал программу с некоторыми потоками (#include pthread.h), и я запускаю ее с помощью sudo.
Один поток запускает процесс (mplayer) и оставляет его запуском, добавляя "&", чтобы система() могла быстро вернуться.
system("mplayer -loop 0 /mnt/usb/* &");
Процесс mplayer работает нормально и воспроизводит музыку, как ожидалось.
После этого я получаю идентификатор процесса, запуская pidof. Скажем, что он возвращает 2449. Метукс posix используется для записи/чтения этого идентификатора процесса в этом потоке и во втором потоке.
Во втором потоке я пытаюсь записать данные в mplayer, используя канал /proc/2449/fd/0 (называется ли это трубой или потоком?):
system("echo \">\" > /proc/2499/fd/0");
system() возвращает 0, но процесс mplayer ничего не получает. Команда ">" должна воспроизводить следующий трек.
Является ли поток stdin унаследован каким-то другим процессом?
Есть несколько fd, перечисленных в процессе 2449, является одним из них (кроме 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, похоже, ничего не получил.
Если вам нужен еще один код, сообщите мне.
Любые подсказки будут оценены. Благодарю.
Я использовал опцию mplayer slave и ввод как файл fifo. Он работает правильно.
Создайте файл Linux fifo с помощью mkfifo:
system("mkfifo /tmp/slpiplay_fifo");
Откройте mplayer с помощью:
system("mplayer -slave -idle -really-quiet -input file=/tmp/slpiplay_fifo /mnt/usb_slpiplay/* &");
Передайте "следующую" команду mplayer с помощью fifo:
system("echo \"pt_step 1\" >> /tmp/slpiplay_fifo");
system
для записи в файл. Просто используйте FILE*f =fopen("/tmp/slpiplay_fifo","w"); fprintf(f,"pt_step 1\n"); fclose(f);
, Стоимость порождения процесса примерно на 1000 дороже, чем просто вызов системного вызова.
Для открытия процесса используйте popen (not 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 = ">";
size_t nNumWritten = fwrite(psData, 1, strlen(psData), pFile);
if(nNumWritten != 1)
// Handl error
...
pclose(pFile);
pFile = NULL;
man 3 popen
может лучше подойти для ваших общих целей. Использование system () дляecho
кажется особенно обходным.popen
вам нужно либо установитьFILE
в режиме с линейной буферизацией или без буферизации (см .:setvbuf
), либоfflush
после того, как вы напечатаете для него команду.