Puede hacer esto en Linux. Digamos que hay un guións
:
#!/bin/bash
i=0
echo my pid: "$$"
while true; do
echo "$i"; ((i++)); sleep 1;
done
Ejecútalo:
$./s
my pid: 8815
0
1
2
Y así sigue... Ahora necesita gdb
para adjuntar al proceso.
gdb -p 8815
Ahora estás en gdb
. Aquí haz esto:
p close(1)
Esto ha cerrado el descriptor de archivo STDOUT. Ahora abre uno nuevo:
p creat("/tmp/8815.out", 0600)
En otra terminal ya puedes configurar el proceso de lectura:
tail -f /tmp/8815.out
Todavía no llega nada, ya que debe desconectarse de gdb
en la otra terminal. Ya sea Ctl + D , o:
q
Quit anyway? (y or n)
Confirme con y
y Introduzca . Y ahora deberías ver (donde tail
se está ejecutando )algo como esto:
173
174
175
Si prefiere usar un archivo o tubería ya existente, hágalo engdb
:
p open("/path/to/your/output", 1)
Esto ilustra la redirección de STDOUT. Es similar con STDERR, solo que tiene el número 2.
Usé estas dos respuestas:
Проблема заключалась в ограничениях systemd cgroup ...
Я проверил "/sys/fs/cgroup/pids/user.slice/user -$UID.slice/pids.max", и там было 10,813. Подняли до 15000 и темы выделили.
Таким образом, Systemd также использует cgroup для ограничения ресурсов и потоков...
этот пост был путем к истине!
Хотя полезно знать, каковы ограничения ресурсов в данной системе, одного этого недостаточно, чтобы определить основную причину ошибки при попытке создать так много собственных потоков. е Что еще более... интересно, ошибка, которую вы получаете от pthread_create()
, говорит вам только о том, что вы превысили пределы ресурсов. Ценная часть информации, которую он не сообщает вам, заключается в том, какие ресурсы (с )были превышены:
EAGAIN - Insufficient resources to create another thread, or a system-imposed limit on the number of threads was encountered. The latter case may occur in two ways: the RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which limits the number of process for a real user ID, was reached; or the kernel's system-wide limit on the number of threads, /proc/sys/kernel/threads-max, was reached. source: https://linux.die.net/man/3/pthread_create
К сожалению, это означает, что вам придется выполнять утомительную ручную отладку, чтобы -указать, какие ограничения ресурсов вызывают вашу проблему.
Боковое примечание:Java Thread
реализованы с собственными потоками операционной системы, которые в Linux представляют собой потоки POSIX (pthreads ). То же самое с C, отсюда и схожие симптомы.
Альтернативой, которая может подойти вам и лучше использовать ваше время, является использование легких -нитей (ака. зеленые нитки ). В отличие от упреждающей потоковой модели собственных потоков (, например. pthreads ), в которых ядро Linux отвечает за переключение между потоками, легкие -потоки являются кооперативными , что означает, что легкие -потоки должны уступать основному потоку через равные промежутки времени. чтобы сохранить ощущение нескольких потоков выполнения.
Хотя на первый взгляд эта модель может показаться неполноценной, большое преимущество легких -потоков заключается в том, что обычно вы можете иметь ~100 000 потоков с минимальным воздействием на доступные ресурсы. Очевидно, что если вы, скажем, откроете файл в каждом из этих легких -потоков, вы вернетесь к тому, с чего начали, но я рекомендую покопаться в легких -потоках, чтобы увидеть, является ли это жизнеспособным решением для ты.