Подтвердить что ты не робот

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
4b9b3361

Ответ 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)

Эти программы перечисляют все системные вызовы, выполненные процессом, включая любые коды ошибок.

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