C / C ++ - Запустите систему («process &») и затем запишите ее в стандартный ввод

0

Я работаю над 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, похоже, ничего не получил.

Если вам нужен еще один код, сообщите мне.

Любые подсказки будут оценены. Благодарю.

  • 2
    man 3 popen может лучше подойти для ваших общих целей. Использование system () для echo кажется особенно обходным.
  • 0
    Для popen вам нужно либо установить FILE в режиме с линейной буферизацией или без буферизации (см .: setvbuf ), либо fflush после того, как вы напечатаете для него команду.
Показать ещё 5 комментариев
Теги:
multithreading
stdin

2 ответа

0
Лучший ответ

Я использовал опцию 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");
  • 2
    Использование именованного канала Unix является хорошим решением. Но не используйте system для записи в файл. Просто используйте FILE*f =fopen("/tmp/slpiplay_fifo","w"); fprintf(f,"pt_step 1\n"); fclose(f); , Стоимость порождения процесса примерно на 1000 дороже, чем просто вызов системного вызова.
  • 0
    Спасибо за совет @MarkLakata. Казалось, быстрее набрать system, чем записать в файл. Я починю это.
1

Для открытия процесса используйте 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню