Russian Qt Forum
Ноябрь 24, 2024, 12:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО][Подтвердите багрепорт] Некорректный запуск процесса QProcess::start  (Прочитано 8273 раз)
Goodr0n
Гость
« : Март 31, 2010, 06:05 »

Есть такой демонстрационный проект.

Код:
 $ cat proclimitdemo.pro 
SOURCES += proclimitdemo.cpp

 $ cat proclimitdemo.cpp
#include <QtGui/QApplication>
#include <QProcess>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    QProcess *pr[400];
    for(int i = 0; i<200; i++)
        {
        qDebug() << i;
        pr[i]=new QProcess();
        pr[i]->start("sleep", QStringList() << "10");
        };
    };

После запуска на выполнение выдает кучу ошибок начиная с 168 итерации. В частности под strace:
Код:
...
write(2, "167 \n", 5167
)                   = 5
pipe2([10, 1009], O_CLOEXEC)            = 0
pipe2([1013, 1015], O_CLOEXEC)          = 0
pipe2([1018, 1019], O_CLOEXEC)          = 0
pipe2([1020, 1021], O_CLOEXEC)          = 0
pipe2([1022, 1023], O_CLOEXEC)          = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7841ad8) = 2443
fcntl64(1022, F_GETFL)                  = 0 (flags O_RDONLY)
fcntl64(1022, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
close(1021)                             = 0
close(10)                               = 0
fcntl64(1009, F_GETFL)                  = 0x1 (flags O_WRONLY)
fcntl64(1009, F_SETFL, O_WRONLY|O_NONBLOCK) = 0
close(1015)                             = 0
fcntl64(1013, F_GETFL)                  = 0 (flags O_RDONLY)
fcntl64(1013, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
close(1019)                             = 0
fcntl64(1018, F_GETFL)                  = 0 (flags O_RDONLY)
fcntl64(1018, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
write(2, "168 \n", 5168
)                   = 5
pipe2([10, 1015], O_CLOEXEC)            = 0
=====================>pipe2(0x98bd788, O_CLOEXEC)             = -1 EMFILE (Too many open files)
write(2, "QProcessPrivate::createPipe: Can"..., 79QProcessPrivate::createPipe: Cannot create pipe 0x98bd788: Too many open files
) = 79
write(2, "QSocketNotifier: Invalid socket "..., 42QSocketNotifier: Invalid socket specified
) = 42
write(2, "QSocketNotifier: Internal error\n", 32QSocketNotifier: Internal error
) = 32
...

Обратите внимание на выделенную (мной) строку. Valgrind ругается аналогично:
Код:
...
165
166
==1839== Warning: invalid file descriptor 1019 in syscall pipe2()
QProcessPrivate::createPipe: Cannot create pipe 0x55ad498: Too many open files
==1839== Warning: invalid file descriptor 1019 in syscall pipe2()
QProcessPrivate::createPipe: Cannot create pipe 0x55ad4a0: Too many open files
==1839== Warning: invalid file descriptor 1020 in syscall close()
167
...

qt версии 4.6.2, система gentoo, флаги сборки ниже
Код:
LANG=C emerge --info
Portage 2.2_rc67 (default/linux/x86/10.0, gcc-4.4.3, glibc-2.11-r1, 2.6.33-gentoo i686)
=================================================================
System uname: Linux-2.6.33-gentoo-i686-Intel-R-_Core-TM-2_Duo_CPU_E7600_@_3.06GHz-with-gentoo-2.0.1
Timestamp of tree: Tue, 30 Mar 2010 19:45:03 +0000
ccache version 2.4 [enabled]
app-shells/bash:     4.1_p2-r1
dev-java/java-config: 2.1.10
dev-lang/python:     2.6.5-r1, 3.1.2-r1
dev-util/ccache:     2.4-r8
dev-util/cmake:      2.8.1
sys-apps/baselayout: 2.0.1
sys-apps/openrc:     0.6.1-r1
sys-apps/sandbox:    2.2
sys-devel/autoconf:  2.13, 2.65
sys-devel/automake:  1.8.5-r4, 1.9.6-r3, 1.10.3, 1.11.1
sys-devel/binutils:  2.20.1
sys-devel/gcc:       4.4.3
sys-devel/gcc-config: 1.4.1
sys-devel/libtool:   2.2.6b
virtual/os-headers:  2.6.33
ACCEPT_KEYWORDS="x86 ~x86"
ACCEPT_LICENSE="*"
CBUILD="i686-pc-linux-gnu"
CFLAGS="-O2 -march=native -mtune=native -pipe -fomit-frame-pointer"
CHOST="i686-pc-linux-gnu"
CONFIG_PROTECT="/etc /usr/share/X11/xkb /usr/share/config"
CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/env.d /etc/env.d/java/ /etc/eselect/postgresql /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/php/apache2-php5/ext-active/ /etc/php/cgi-php5/ext-active/ /etc/php/cli-php5/ext-active/ /etc/revdep-rebuild /etc/sandbox.d /etc/terminfo"
CXXFLAGS="-O2 -march=native -mtune=native -pipe -fomit-frame-pointer"
DISTDIR="/var/portage/distfiles"
FEATURES="assume-digests buildpkg candy ccache distlocks fixpackages news parallel-fetch preserve-libs protect-owned sfperms strict unmerge-logs unmerge-orphans userfetch"
GENTOO_MIRRORS="http://gentoo.nix-files.org.ru"
LANG="C"
LC_ALL=""
LDFLAGS="-Wl,-O1"
LINGUAS="ru"
MAKEOPTS="-j5"
PKGDIR="/var/portage/packages"
PORTAGE_CONFIGROOT="/"
PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --compress --force --whole-file --delete --stats --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"
PORTAGE_TMPDIR="/var/portage/.tmp"
PORTDIR="/var/portage"
PORTDIR_OVERLAY="/usr/local/portage/my"
SYNC="rsync://gentoo.nix-files.org.ru/gentoo-portage"
USE="7zip X a52 aac aalib acl acpi aim alsa amr amrnb amrwb apache2 bash-completion blender-game bluetooth bzip2 cairo cli clock-screen clucene consolekit cracklib crypt ctype cups curl cxx dbus djvu dri dvd dvdread embedded embedded-fuseiso encode ffmpeg filter flac foomaticdb fts3 gd gdbm gecko gif glitz gnutls gpm hal hash hddtemp iconv icotools icq icu imagemagick irc jabber jpeg jpeg2k kde kde4 kdm key-screen kqemu kvm lcms ldap libcaca libwww lm_sensors lzma mbox md5sum melt mmx mng modules mouse mp2 mp3 mp4 mppe-mppc mrnb mudflap mysql ncurses nls nptl nptlonly nsplugin nvidia ogg opencore-amr opengl openmp oscar pae pam passwordsave pch pcre pdf perl png postgres ppds pppd python qemu qt3 qt3support qt4 qtscript quicktime rcc rdesktop readline redland reflection samba sasl scanner sdl search-screen secure-delete semantic-desktop session spl sql sqlite sqlite3 sse sse2 ssl ssse3 startup-notification svg sysfs tcpd theora threads tiff unicode usb vcd vnc vorbis vram webkit wifi win32codecs winetools winetriks x264 x86 xattr xcb xcomposite xinerama xml xorg xscreensaver xv xvid zlib" ALSA_CARDS="hda-intel" ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol" APACHE2_MODULES="actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias" ELIBC="glibc" INPUT_DEVICES="evdev keyboard mouse" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LINGUAS="ru" QEMU_SOFTMMU_TARGETS="arm i386 x86_64" RUBY_TARGETS="ruby18" USERLAND="GNU" VIDEO_CARDS="vesa intel radeon"
Unset:  CPPFLAGS, CTARGET, EMERGE_DEFAULT_OPTS, FFLAGS, INSTALL_MASK, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS

Мне кажется передевать сисколу pipe2 левый пойнтер вместо массива дескрипторов не лучшая идея. Я собираюсь составить багрепорт, но сначала подтвердите повторяемость бага.
« Последнее редактирование: Март 31, 2010, 08:55 от Goodr0n » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 31, 2010, 06:23 »

Подтверждаю.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
niXman
Гость
« Ответ #2 : Март 31, 2010, 06:31 »

Цитировать
Мне кажется передевать сисколу pipe2 левый пойнтер вместо массива дескрипторов не лучшая идея.
о чем речь?

а по поводу сообщений - у юзера есть ограничение на кол-во одновременно открытых файлов для процесса. так что 168, это не мало. и, думаю, не является ошибкой.
Записан
Goodr0n
Гость
« Ответ #3 : Март 31, 2010, 06:43 »

Речь про вот это.
pipe2(0x98bd788, O_CLOEXEC)             = -1 EMFILE (Too many open files)

Ограничение на количество открытых файлов/процессов снято. Впрочем под рутом тоже самое. Интересно что в третьих qt для этих целей использовался pipe и ошибок не вызывал.
Записан
niXman
Гость
« Ответ #4 : Март 31, 2010, 06:57 »

Цитировать
Речь про вот это.
нормальная практика. не вижу в этом ничего необычного.

Цитировать
Ограничение на количество открытых файлов/процессов снято.
не правда. выводимое сообщение, это сообщение ОС а не Qt.

думаю багрепорта у вас не получится. аргументы не убедительны.
Записан
niXman
Гость
« Ответ #5 : Март 31, 2010, 07:03 »

добавьте в код, такую строку:
Код
C++ (Qt)
std::cout << "_SC_OPEN_MAX == " << sysconf(_SC_OPEN_MAX) << std::endl;
 
Записан
Rcus
Гость
« Ответ #6 : Март 31, 2010, 07:05 »

Попробовал - при ulimit -n 1024 - ошибки в консоль начинают сыпаться после 168 процессов, для -n 2048 - после 339. Линейная прогрессия однако.
Записан
Goodr0n
Гость
« Ответ #7 : Март 31, 2010, 07:10 »

Хорошо, давай это обсудим.

Для начала:  
$ ulimit
unlimited

Во-вторых, та же самая программа откомпилированная Qt 3.3.8 прекрасно работает. В-третьих обратите внимание на разницу синтаксиса вывода strace
write(2, "167 \n", 5167
)                   = 5
pipe2([10, 1009], O_CLOEXEC)            = 0
pipe2([1013, 1015], O_CLOEXEC)          = 0
pipe2([1020, 1021], O_CLOEXEC)          = 0
pipe2([1022, 1023], O_CLOEXEC)          = 0
 -- нормальный массив до ошибки

write(2, "168 \n", 5168
)                   = 5
pipe2([10, 1015], O_CLOEXEC)            = 0
pipe2([1019, 1021], O_CLOEXEC)          = 0
pipe2(0x98bd788, O_CLOEXEC)             = -1 EMFILE (Too many open files)
 -- и хз что после.

Аргументация  слабоватая, согласен. Кстати у самого то выдала ошибку?
Записан
Goodr0n
Гость
« Ответ #8 : Март 31, 2010, 07:12 »

добавьте в код, такую строку:
Код
C++ (Qt)
std::cout << "_SC_OPEN_MAX == " << sysconf(_SC_OPEN_MAX) << std::endl;
 

_SC_OPEN_MAX == 1024

Хм. Похоже действительно мой косяк. Ладно, всем спасибо.
Проблема здесь пожалуй только в том что несмотря на невозможность создания коммуникационных каналов, процесс все равно стартует. Ну и неочевидный лимит.
« Последнее редактирование: Март 31, 2010, 07:15 от Goodr0n » Записан
niXman
Гость
« Ответ #9 : Март 31, 2010, 07:32 »

Цитировать
Кстати у самого то выдала ошибку?
да. результат в точности что и у Rcus.

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

Цитировать
Ну и неочевидный лимит.
да. как-то я в замешательстве. надо погуглить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.097 секунд. Запросов: 22.