getrusage() получает системное время, пользовательское время. Помощь в программировании Unix
Я пишу оболочку, в которой мне нужно запустить несколько дочерних процессов одновременно и записать системное время и время пользователя.
Пока я могу это сделать. Единственная проблема заключается в том, что я использую wait4 для захвата системных ресурсов, используемых дочерней программой, и помещаю их в мою структуру rusage, называемую use.
Как я могу запустить все процессы одновременно и отслеживать время пользователя и системы? Я могу удалить системный вызов wait4() и использовать его снаружи для цикла, чтобы я мог заставить родителя ждать, но если я сделаю это, то смогу записать только время для последнего процесса, а не все.
Ты хоть представляешь, как я могу это исправить?
execute(commandPipev,"STANDARD",0);
wait4(pid,&status,0,&usage);
printf("Child process: %s\t PID:%d\n", commandPipev[0], pid);
printf("System time: %ld.%06ld sec\n",usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf("User time: %ld.%06ld sec\n\n",usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
1 ответ
Запутанный ответ.
В среде POSIX запустите потомки, затем используйте waitid()
с WNOWAIT
возможность сказать вам, что какой-то ребенок вышел. Эта опция оставляет ребенка в состоянии ожидания, то есть вы можете использовать еще один вызов из семейства ожидания, чтобы получить необходимую информацию. Затем вы можете использовать не POSIX wait4()
системный вызов для сбора информации об использовании только что вышедшего ребенка и ведения бухгалтерского учета, который вам необходим. Обратите внимание, что вы можете обнаружить, что между waitid()
а также wait4()
звонки; вам нужно использовать цикл и соответствующие флаги и тесты, чтобы собрать все доступные трупы (мертвые дочерние процессы), прежде чем вернуться к waitid()
вызовите, чтобы узнать о других ранее незавершенных дочерних процессах. Вам также нужно беспокоиться о функциях семейства ожидания, возвращающих информацию для процесса, который ранее был запущен в фоновом режиме, а теперь завершен.
Справочная страница Linux для wait4(2) предполагает, что WNOWAIT
может работать напрямую с wait4(2)
Таким образом, вы можете сделать все более аккуратно - если вам действительно нужен этот вариант.
Подумайте, можете ли вы использовать группы процессов для группировки дочерних процессов, чтобы упростить ожидание членов группы процессов.