Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Процессы сами останавливаются


Автор: JekaZZ 23.12.2008, 16:17
Есть программа, которая запускает mplayer с помощью system(). Это делается в pthread потоке.

Код

int rc=0;
pthread_attr_t tattr;
    if (pthread_attr_init(&tattr)==0)
    {
        if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED))
        {
            m_logger->Error("%s:%d Unable to detach thread: %s", __FILE__, __LINE__, strerror(errno));
                        }
        rc=pthread_create(thread, &tattr, routine, arg);
        pthread_attr_destroy(&tattr);
    } else
    {
        m_logger->Warning("%s:%d Unable to init thread attrs: %s - set default", __FILE__, __LINE__, strerror(errno));
        rc=pthread_create(thread, NULL, routine, arg);

        if (!rc)
        {
            //Отсоединяем нить
            rc=pthread_detach(*thread);
        }
    }



В routine вызывается system("mplayer -dumpstream -dumpfile some_file some_stream");

Так вот вчера все работало, а сегодня с утра на запуске system("mplayer...") останавливается mplayer и вся программа. 
Смотрю 
Код

#ps -aux

в колонке STATE у mplayer-а стоит T, у пограммы - T1.

Разбудить прграмму на несколько секунд удается:
Код

#kill -CONT program_pid

После чего она снова переходит в T1. Если же за это время успеть дать команду на завершение потока плеера, плеер завершается и программа продолжает нормально работать. Сам mplayer kill-ом не будится.

Вручную из командной строки mplayer запускается и работает. В чем дело? Я совсем не понимаю  smile 

Автор: JekaZZ 23.12.2008, 17:03
Обнаружились новые ньюансы.
Если программу разбудить
Код

kill -CONT

то она сама не останавливается, работает нормально, до тех пор пока не попытаешься разбудить mplayer таким же образом. 
Тогда и плеер не работает и программа снова останавливается - переходит в T1.  smile 

Автор: vinick 23.12.2008, 18:36
попробуй  в вызове system перенаправить вывод mplayer'а  в dev/null
Код

system("mplayer ... &>/dev/null");

Автор: MAKCim 23.12.2008, 23:10
JekaZZ, 
отладчиком/трассировщиком пройтись не судьба?  smile 

Автор: JekaZZ 24.12.2008, 11:40
>/dev/null не помог. Да и, собтвенно говоря, как он должен был помочь?

Ни отладчиком, ни трассировщиком не судьба: 
1) Я в линуксе только начал программировать.
2) Проект не мой, я его доделываю и переделываю. 
3) результате сборки проекта - 4 разделяемых библиотеки *.so и 6 выполняемых файлов. Все делается в консоли.

В чем может быть проблема? Под виртуалкой на той же системе все работает. Те же скомпилиные, под виртуалкой рабочие, бинарники на реальном железе виснут. Может в системе что накрылось? Почему система усыпляет поток?

Автор: MAKCim 24.12.2008, 20:15
JekaZZ, 
аргументы не принимаются
смотри трассировщиком
самое простое через strace
Код

# strace -f <your program> 2>log

Автор: vinick 24.12.2008, 21:08
Цитата(JekaZZ @  24.12.2008,  11:40 Найти цитируемый пост)
>/dev/null не помог. Да и, собтвенно говоря, как он должен был помочь?

Просто подобное происходит на связке mc + gdb + многопоточное приложение, вот я и написал не подумавши. Это не тот случай, так что strace в помощь

Автор: JekaZZ 26.12.2008, 12:47
strace останавливается на следующих строках:

[pid 13546] stat64("/home/itvuser/.itvmedia/itv/data/channel_bestrussiantv.xml.enc/00000000.stream",  <unfinished ...>
[pid 13491] ioctl(29, FIONREAD <unfinished ...>
[pid 13486] select(0, NULL, NULL, NULL, {0, 1000} <unfinished ...>
[pid 13546] <... stat64 resumed> 0xb3c1930c) = -1 ENOENT (No such file or directory)
[pid 13491] <... ioctl resumed> , [0])  = 0
[pid 13546] nanosleep({0, 10000000},  <unfinished ...>
[pid 13491] nanosleep({0, 10000000},  <unfinished ...>
[pid 13545] <... rt_sigaction resumed> {SIG_DFL}, 8) = 0
[pid 13545] stat64("/root/.mplayer/ch1?sid=28515CDA35B15108FA0AB26B49BA6273AE2794352BD7907FB226CED157E8688F.conf", 0xbfb7a320) = -1 ENOENT (No such file or directory)
[pid 13545] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 13545] ioctl(0, SNDCTL_TMR_START or TCSETS

где home/itvuser/.itvmedia/itv/data/channel_bestrussiantv.xml.enc/00000000.stream - файл дампа, в который mplayer пишет  поток.


Вот то же самое место, но с запущенным вручную mplayer из командной строки:

rt_sigaction(SIGCHLD, {0x8078d60, [CHLD], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTERM, {0x8078d90, [TERM], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGHUP, {0x8078d90, [HUP], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, {0x8078d90, [INT], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, {0x8078d90, [QUIT], SA_RESTART}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPIPE, {0x8078d90, [PIPE], SA_RESTART}, {SIG_DFL}, 8) = 0
stat64("/root/.mplayer/ch1?sid=C099C45A8D095910624A7A8371F2FA73760F0C9D537718E75A5E56611F305027.conf", 0xbfa5b7b0) = -1 ENOENT (No such file or directory)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_START or TCSETS, {B38400 opost isig -icanon -echo ...}) = 0
write(1, "\nPlaying mms://69.1.72.2/ch1?sid"..., 99
Playing mms://69.1.72.2/ch1?sid=C099C45A8D095910624A7A8371F2FA73760F0C9D537718E75A5E56611F305027.
) = 99
open("mms://69.1.72.2/ch1?sid=C099C45A8D095910624A7A8371F2FA73760F0C9D537718E75A5E56611F30.ifo", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)

В таком случае плеер работает.
Помогите разобраться. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)