C, которая запускается с использованием системы
Я узнал о функции system() is stdlib.h и понял, что могу создать программу, которая запускала себя с помощью system(). Я написал этот код и попробовал его:
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("x");
system("./a.out");
}
Он печатает ровно 563 x для консоли каждый раз, когда я запускаю его перед нормальным выходом (без ошибок). Я хотел бы знать, что останавливает программу, и откуда этот номер, как мне кажется, очень произволен. Благодаря
Спасибо за понимание этой первой программы, но я не уверен, что система ее останавливает, потому что у нее заканчиваются ресурсы по следующей причине: я просто написал эту новую программу, и она еще не остановилась.
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("x");
system("./a.out");
system("./a.out");
}
Кроме того, когда я попытался открыть новое окно консоли, я получил эту ошибку:
/.oh-my-zsh/lib/theme-and-appearance.zsh:24: fork failed: resource temporarily unavailable
/.oh-my-zsh/oh-my-zsh.sh:57: fork failed: resource temporarily unavailable
Ответы
Ответ 1
Сначала я займусь второй программой, так как это проще всего объяснить. Попробуйте использовать этот код, который будет печатать глубину рекурсии по мере ее появления.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv){
int depth = argc > 1 ? atoi(argv[1]) : 0;
printf("%d\n", depth);
char cmd[128];
sprintf(cmd, "%s %d", "./a.out", depth+1);
system(cmd);
system(cmd);
}
Он будет расти до вашего предела (в моем случае 538), а затем начнет разбивать дерево рекурсии вверх и вниз.
530 531 532 533 534 535 536 537 538 538 537 538 538 536 537
В конце концов этот процесс завершится, но это займет очень много времени!
Что касается первой программы. Я считаю, что вы просто используете лимит пользовательских процессов.
Вы можете найти свой предел процесса, запустив
ulimit -u
В моем случае предел равен 709. Подсчитайте мои другие процессы, запущенные с помощью
ps aux | grep user | wc -l
Это дает мне 171. 171 + 538 (моя глубина, на которой программа умерла) дает вам твердый ответ:)
https://superuser.com/questions/559709/how-to-change-the-maximum-number-of-fork-process-by-user-in-linux
Ответ 2
В вашей программе нет ничего, чтобы остановить бесконечную рекурсию.
You execute a.out.
a.out executes a.out
a.out executes a.out
a.out executes a.out
a.out executes a.out
и т.д.
В какой-то момент система запускает ресурсы и не выполняет следующий вызов system
и выход программ в обратном порядке. Похоже, что ваш компьютер достиг предела, когда он запускал программу 563 раза.
Ответ 3
Чтобы увидеть, что происходит под капотом, используйте одну из следующих программ:
- strace (Linux)
- ktruss (Solaris)
- ktrace (BSD)
- Монитор процессов (Windows)
Эти программы перечисляют все системные вызовы, выполненные процессом, включая любые коды ошибок.
Прочитайте их документацию, так как это поможет вам больше в долгосрочной перспективе, чем я, давая здесь один вариант использования.