2013-08-10 3 views
-1

У меня есть программа, которую я написал в C, которая запускает mplayer с помощью трубы, а затем управляю mplayer через этот канал. Кажется, что когда я посылаю команду над трубой, она сработает. Ниже приведены соответствующие части моего кода и то, что я сделал для его отладки.сбой программы при отправке данных по трубе в mplayer

Исходный код:

FILE *mplayer_pipe; 
char temp[256]; 

bzero(temp,256); 
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log"); 
mplayer_pipe = popen((char*)temp, "w"); 

/* watch some values to see what to do next */ 

/* if I see a value that means I should stop mplayer I do this */ 

fputs("stop\n",mplayer_pipe); 
fflush(mplayer_pipe); 
pclose(mplayer_pipe); 

Я столкнулся с проблемой, что если MPlayer закончил, таким образом, делая это так ничто не находится на другом конце трубы, и я до сих пор трубы над остановкой моя программа падает , Чтобы решить эту проблему, я заменил ее на следующее:

FILE *mplayer_pipe; 
char temp[256]; 

bzero(temp,256); 
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log"); 
mplayer_pipe = popen((char*)temp, "w"); 

/* watch some values to see what to do next */ 

/* if I see a value that means I should stop mplayer I do this */ 

FILE *mplayer_status; 
int mplayer_pid = 0; 
char status_read_char[256]; 
bzero(status_read_char,256); 

mplayer_status = popen("pidof -s mplayer", "r"); 
fgets(status_read_char, 6, mplayer_status); 
pclose(status_read_char); 
mplayer_pid = atoi(status_read_char); 

if(mplayer_pid > 0) { 
fputs("stop\n",mplayer_pipe); 
fflush(mplayer_pipe); 
pclose(mplayer_pipe); 
} 
else { 
pclose(mplayer_pipe); 
} 

Это исправление отлично подойдет для меня, и оно перестает рушиться.

Затем я разрешил другим использовать программу, и я начинаю получать сообщение сбой каждый раз в то время. Поскольку я не мог получить свою программу, чтобы свалить себя, я меняю ее на следующую, чтобы увидеть, где программа рушилась.

FILE *mplayer_pipe; 
char temp[256]; 

bzero(temp,256); 
sprintf(temp,"mplayer -quiet -slave video.mkv > mplayer.log"); 
mplayer_pipe = popen((char*)temp, "w"); 
printf("command: mplayer -quiet -slave video.mkv > mplayer.log"); 

/* watch some values to see what to do next */ 

/* if I see a value that means I should stop mplayer I do this */ 

FILE *mplayer_status; 
int mplayer_pid = 0; 
char status_read_char[256]; 
bzero(status_read_char,256); 

mplayer_status = popen("pidof -s mplayer", "r"); 
fgets(status_read_char, 6, mplayer_status); 
pclose(status_read_char); 
mplayer_pid = atoi(status_read_char); 
printf("mplayer_status: command: pidof -s mplayer. Got %s, value %d.",status_read_char,mplayer_pid); 

if(mplayer_pid > 0) { 
fputs("stop\n",mplayer_pipe); 
fflush(mplayer_pipe); 
printf("command: stop."); 
pclose(mplayer_pipe); 
} 
else { 
pclose(mplayer_pipe); 
} 

Последняя вещь, которую я получил, прежде чем моя программа разбился в следующий раз был:

mplayer_status: command: pidof -s mplayer. Got 27323, value 27323. 

Для меня это указывает на то, что это происходит сбой в то время как трубопровод через стоп команду к MPlayer.

Кто-нибудь знает, что здесь не так? И любые идеи о том, как предотвратить его от сбоев?

ответ

1

Вместо отправки команды остановки mplayer, почему бы вам просто не отправить ее SIGTERM и закрыть трубу? Mplayer обнаруживает сигнал и останавливается сам по себе.

kill(mplayer_pid, SIGTERM); 
pclose(mplayer_pipe); 

Не забудьте включить sys/types.h и signal.h в вашей программе.

Смежные вопросы