Имеется 2 задачи. Требуется сделать 2 проги. 1ая должна выполнять такие действия: 1. Создание процесса-потомка, в котором выполняется программа «Notepad». 2. Вывод идентификатора дочернего процесса.
3. Ожидание завершения дочернего процесса. 2ая такие: 1. Вывод начального значения 64-битной целочисленной переменной Var, объявленной с квалификатором volatile. 2. Запуск параллельного выполнения 20 потоков, каждый из которых выполняет 100 000 000 изменений переменной Var, адрес которой должен быть передан ему в качестве входного параметра.
При этом 10 потоков 100 000 000 раз увеличивают 32-битное целое число, хранящееся в старших 32-битах переменной Var на 1, 10 потоков 100 000 000 раз уменьшают 32-битное целое число, хранящееся в младших 32-битах переменной Var на 1. 3. Первый завершившийся поток каждого типа принудительно завершает все остальный потоки своего типа. 4. Вывод конечных значений 32-битных целых чисел, хранящихся в старших и младших 32-битах переменной Var. Прошу помочь с решением простой первой, потому как не могу понять процессы даже так. p.s. Прочитал справку по всем основным требующимся функциям, включая CreateProcess(), TerminateProcess(), CreateThread(), TerminateThread(), CloseHandle(), ExitThread(), но принцип их действия в одной программе понять не смог( Буду признателен за любую помощь!
Интересные фишки в Notepad++ часть #1
Источник: studassistent.ru
Создание процесса потомка в котором выполняется программа notepad
Процесс-потомок и процесс-родитель получают разные коды возврата после вызова fork() . Процесс-родитель получает идентификатор (PID) потомка. Если это значение будет отрицательным, то при создании процессов произошла ошибка. Процесс-потомок получает в качестве кода возврата значение 0, если вызов fork() произошел успешно.
Таким образом, можно проверить, был ли создан новый процесс.
case -1: /*при вызове fork() возникла ошибка*/
case 0 : /*это код потомка*/
default : /*это код родительского процесса*/
> Пример вызова fork() приведен ниже (рис. 1):
perror(«fork»); /* произошла ошибка */
exit(1); /* выход из родительского процесса */
printf(» CHILD: Это процесс-потомок!n»);
printf(» CHILD: Мой PID — %dn», getpid());
printf(» CHILD: PID моего родителя — %dn»,getppid());
printf(» CHILD: Введите мой код возврата (как можно меньше):»);
printf(» CHILD: Выход!n»);
printf(«PARENT: Это процесс-родитель!n»);
printf(«PARENT: Мой PID — %dn», getpid());
printf(«PARENT: PID моего потомка %dn», pid);
printf(«PARENT: Я жду, пока потомок не вызовет exit(). n»);
printf(«PARENT: Код возврата потомка:%dn»,WEXITSTATUS(rv));
Обзор редактора Notepad++
Рис. 1. Пример вызова fork ().
Когда потомок вызывает exit() , код возврата передается родителю, который ждет его, вызвав wait() . WEXITSTATUS() представляет собой макрос, который получает фактический код возврата потомка из вызова wait() .
Функция wait() ждет завершения первого из всех возможных потомков родительского процесса. Иногда необходимо точно определить, какой из потомков должен завершиться. Для этого используется вызов waitpid() с соответствующим PID потомка в качестве аргумента. Еще один момент, на который следует обратить внимание, это то, что и родитель и потомок используют переменную rv . Это не означает, что переменная разделена между процессами. Каждый процесс содержит собственные копии всех переменных.
Рассмотрим следующий пример (рис. 2).
sprintf(pid, «PID : %dn»,getpid());
write(STDOUT_FILENO, pid, strlen(pid));
Рис. 2. Порождение нескольких потомков.
В этом случае будет создано семь процессов-потомков. Первый вызов fork() создает первого потомка. Как указано выше, процесс наследует положение указателя команд от родительского процесса. Указатель команд содержит адрес следующего оператора программы. Это значит, что после первого вызова fork() , указатель команд и родителя, и потомка находится перед вторым вызовом fork() .После второго вызова fork() и родитель, и первый потомок производят потомков второго поколения — всего процессов становится 4. После третьего вызова fork() каждый процесс производит своего потомка, увеличивая общее число процессов до 8.
Так называемые процессы — зомби возникают, если потомок завершился, а родительский процесс не вызвал wait() . Для завершения процессы используют либо оператор возврата, либо вызов функции exit() со значением, которое будет возвращено операционной системе. Операционная система оставляет процесс зарегистрированным в своей внутренней таблице данных, пока родительский процесс не получит кода возврата потомка, либо не закончится сам. В случае процесса-зомби его код возврата не передается родителю и запись об этом процессе не удаляется из таблицы процессов операционной системы. При дальнейшей работе и появлении новых зомби таблица процессов может быть заполнена, что приведет к невозможности создания новых процессов.
Next: Запуск процессов с помощью Up: Процессы Previous: Таблица процессов Contents 2003-12-09
Источник: www.opennet.ru
Создание процесса потомка в котором выполняется программа notepad
Помогите, пожалуйста, вот с такой задачей
Требуется создать 2 программы.
Программа 1 должна выполнять следующие действия:
1. Создание процесса-потомка, в котором выполняется программа «Notepad».
Программа 2 должна выполнять следующие действия:
1. Вывод начального значения целочисленной переменной Var.
2. Запуск 20 потоков, каждый из которых выполняет 100 000 000 изменений переменной Var, адрес которой должен быть передан ему в качестве входного параметра.
При этом 10 потоков 100 000 000 раз увеличивают переменную Var на 1, 10 потоков 100 000 000 раз уменьшают переменную Var на 1.
3. Вывод конечного значения целочисленной переменной Var.
1. В программах должны использоваться вызовы функций CreateProcess(), CreateThread(), WaitForSingleObject() (или WaitForMultipleObjects()), CloseHandle(), ExitThread().
2. Вызовы функций должны сопровождаться проверкой возвращаемых значений.
Источник: www.programmersforum.ru