Команда отмены запуска программы или ее прерывания

Есть программа, написанная на C#, Windows.Form.
Какой встроенной функцией мне прекратить выполнение программы?
Важно: необходимо не завершить процесс, а именно прекратить, чтобы можно было дальше работать с программой. Пробовал функции exit() и System.Threading.Thread.CurrentThread.Abort() — после выполнения функций происходило закрытие формы.

Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 19 дек 2014 в 20:06
МаринаВоин МаринаВоин
898 5 5 серебряных знаков 10 10 бронзовых знаков

>Важно: необходимо не завершить процесс, а именно прекратить. Что бы можно было дальше работать с программой Эмм..это как?

19 дек 2014 в 20:15

Смотри, при вызове команды exit() идет закрытие программы(Windows Forms). А мне надо не закрывать, а просто закончить выполнение всех функций.

19 дек 2014 в 20:18

Извините конечно, но вы сами-то понимаете, чего хотите? Нет такого понятия как «закончить выполнение всех функций». Программа (и соответствующий ей процесс) либо запущена и работает, либо не запущена, и, соответсвенно, не работает. Выполняет ли она при этом какие-то действия или нет — это уже зависит от логики программы, нет такой волшебной функции, которая заставила бы программу магическим образом корректно завершить свою внутреннюю логику и при этом остаться в памяти.

AVR 11# Прерывания

19 дек 2014 в 20:27

Вы, конечно, можете сделать Thread.Sleep или Suspend, но эти методы лишь приостанавливают текущий поток, а не «заканчивают выполнение всех функций». При этом ваша программа просто зависнет

Источник: ru.stackoverflow.com

15. Прерывание выполнения Программы

Вы можете прервать вашу программу, используя функцию abort. Прототип для этой функции находится в » stdlib.h «.

void abort (void) (функция)

Функция abort вызывает аварийное окончание программы. Она не выполняет функции очистки, зарегистрированные с atexit или on_exit.

Эта функция фактически завершает процесс, вызывая сигнал SIGABRT, и ваша программа может включать обработчик, чтобы прервать этот сигнал; см. Главу 21 [Обработка Сигнала].

16. Внутренняя организация Окончания

Функция _exit — примитив, используемый для окончания процесса exit. Она объявлена в заглавном файле » unistd.h «.

void _exit (int status) (функция)

_exit — функция для завершения процесса с состоянием status. Вызов этой функции не выполняет функции очистки, зарегистрированные с atexit или on_exit.

Когда процесс завершается по любой причине либо явным запросом окончания, либо окончанием в результате сигнала, производятся следующие действия:

Все описатели открытого файла в процессе будут закрыты. См. Главу 8 [Ввод — вывод низкого уровня].

Windows Powershell: Что это и как использовать? Основные команды ️⚙️

8 битов младшего разряда возвращающегося кода состояния сохранены, для передачи родительскому процессу через wait или waitpid; см. Раздел 23.6 [Завершение Процесса].

Любым дочерним процессам завершаемого процесса будет назначен новый родительский процесс. (Это — init процесс, с ID процесса 1.)

Сигнал SIGCHLD послан родительскому процессу.

Если, процесс является лидером сеанса, который контролировал терминал управления, то сигнал SIGHUP будет послан каждому процессу в приоритетной работе, и терминал управления — будет отсоединен от этого сеанса. См. Главу 24 [Управление заданиями].

Если окончание процесса останавлвает любой элемент группы этого процесса, то сигнал SIGHUP и сигнал SIGCONT будет послан каждому процессу в группе.

17. Ввод/вывод файлов с помощью командной строки.

До сих пор наши программы могли только принимать символы с клавиатуры и высвечивать их на экране монитора. Они как бы находились в заточении и могли лишь перестукиваться с соседом по камере, в то время как огромный и прекрасный внешний мир оставался недоступен. Настало время вышибить тюремную дверь и соединиться с миром файлов, откуда программа берет необходимую информацию и куда возвращает результаты своей работы.

Файлами, как вы знаете, называется то, что очень быстро забивает жесткий диск любого размера. У каждого файла есть имя, обычно состоящее из букв, разделенных точками, например: sort.c , dog.jpg и т.д. Буквы, стоящие правее последней точки, называются расширением и по ним часто можно узнать, информация какого вида хранится в файле. Так, расширение .jpg обычно бывает у файлов, хранящих изображения, а расширение .c говорит о том, что это исходный текст программы на Си.

И наш первый опыт работы с файлами как раз и будет связан с этими исходными текстами. Дело в том, что при отладке программ программистам необходимо многократно просматривать исходные тексты, и чем больше строк удается увидеть, тем лучше. Для просмотра подходят редакторы Блокнот (Notepad) и улучшенный Notepad — Ecopad32.

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

Читайте также:
Mind maps лучшие программы

Программа на языке Си общается с файлом с помощью специальной переменной — указателя файла, которая объявляется как

То есть, формально создается указатель на тип FILE, которому нужно присвоить определенное значение функцией fopen():

где «режим» определяет характер работы с файлом, а «имя» должно должно быть именем реального файла, иначе функция fopen() возвратит NULL. Соединение программы с файлом может выглядеть так:

in = fopen(«имя», «rb»);

Режим «rb» означает, что файл открывается только для чтения (r) (в целях безопасности) и рассматривается как бинарный (b), то есть воспринимается «как есть» со всем своим содержимым. После успешного открытия файла программа получает в свое распоряжение переменную in, которая передается как параметр различным функциям.

В этом разделе нас будут интересовать две функции, работающие с файлами: функция, читающая строку из файла и функция, записывающая строку в файл.

Но прежде чем переходить к знакомству с ними, нужно, пожалуй, сделать небольшое отступление и рассказать о том, что текстовые файлы, к которым относятся и тексты программ, состоят из отдельных строк. Каждая строка заканчивается специальными символами, которые показывают программе просмотра (такой как Блокнот), что следующие символы нужно показывать с новой строки. В разных системах символы окончания строки разные, но в DOS и Windows строку завершают два невидимых байта 0D0A (в шестнадцатеричном представлении).

После знакомства со строками, можно перейти к стандартным функциям чтения строки из файла fgets() и записи строки в файл fputs().

Первая из них имеет три параметра:

fgets(char * buf, int n, FILE *f).

Первый параметр (buf) указывает на массив символов, в котором хранится прочитанная строка, во втором параметре (n) хранится максимальное число прочитанных символов, в третьем (f) — файловый указатель. Функция fgets() использует внешнюю память, на которую указывает buf. Эта память, задаваемая массивом или выделяемая функцией malloc(), не безгранична.

Поэтому в функции fgets() и предусмотрен второй параметр n, ограничивающий длину читаемой строки. Функция прочитает n-1 символов, поставит в конце нулевой символ ‘’ и перейдет к следующей строке. Значит, некоторые слишком длинные строки могут быть обрезаны1. После успешного чтения каждой строки fgets() возвращает указатель на буфер, где эта строка хранится (в нашем случае это buf), если же достигнут конец файла или возникла ошибка при чтении, fgets() возвращает NULL.

Функция fputs() устроена проще:

fputs(char *buf, FILE *f).

В ней всего два параметра. Функция fputs() записывает строку из буфера buf в файл f, причем перед записью символ ‘’, прибавленный fgets(), удаляется.

Теперь нам почти хватает знаний, чтобы понять программу, показанную в листинге 6.1

#define BSIZE 200

Строка #define BSIZE 200 определяет символическую константу BSIZE. Значок # роднит эту строку с первой, #include. уже хорошо нам знакомой. Обе строки обрабатываются еще до компиляции так называемым препроцессором. Встретив строку #define препроцессор заменяет всюду в тексте программы «BSIZE» на «200». Значит, компилятор увидит строку char buf[200], a не char buf[BSIZE].

В языке Си часто используются символические константы, так как это позволяет легко менять параметры, от которых зависит программа.

Строка FILE *in, *out объявляет два файловых указателя: in и out. Первый связывается с исходным файлом, а второй — с файлом, куда записывается результат.

Строка in=fopen(«l21.c»,»rb») открывает файл под именем l21.c ( файл l21.c нужно предварительно создать в каком-нибудь редакторе, например Блокнот). Разумно поместить в этот файл исходный текст программы, показанной в листинге 2.1 и связывает с ним указатель in. Вторая строка создает новый файл z.c. Если файл z.c уже существует, его содержимое теряется, и после выполнения строки out=fopen(«z.c»,»wb») на его месте создается файл с тем же именем, но совершенно пустой.

Перед чтением строки из файла в нулевой элемент массива buf засылается символ табуляции buf[0]=’t’.

Далее в цикле читается строка файла fgets(buf+1, BSIZE-1,in). Обратите внимание, функции fgets() передается buf+1 — указатель на первый элемент буфера, потому что в нулевом уже находится символ табуляции. Из-за того, что один элемент буфера всегда занят, функции передается число, на единицу меньшее размера буфера.

Ну вот, наконец-то мы добрались до главного цикла while(), в котором читается очередная строка, проверяется значение, возвращаемое функцией fgets(), и если оно не равно NULL, конец файла еще не достигнут, и функция fputs() переписывает строку вместе с символом табуляции в файл z.c.

Казалось бы, все сделано. Но после того, как все строки обработаны, работа еще не закончена. Файлы остаются соединенными с программой и могут быть случайно изменены. Перед завершением программы необходимо отсоединиться от файлов или, как говорят, закрыть их. Делается это функцией fclose(), которой надо передать указатель на закрываемый файл.

Читайте также:
Объектами патентного права являются программы для эвм

Попробуйте взять файл l21.c с исходным текстом, запустить программу, текст которой показан в листинге 6.1, и посмотрите, что окажется в файле z.c. Помните, что программа и файл l21.c должны находиться в одной папке.

Источник: studfile.net

Управление процессами в Linux

Денис Колисниченко Процессы. Системные вызовы fork() и exec(). Нити.
Перенаправление ввода/вывода
Команды для управление процессами
Материал этой статьи ни в коем случае не претендует на свою избыточность. Более подробно о процессах вы можете прочитать в книгах, посвященных программированию под UNIX.

Процессы. Системные вызовы fork() и exec(). Нити.

  1. Выделяется память для описателя нового процесса в таблице процессов
  2. Назначается идентификатор процесса PID
  3. Создается логическая копия процесса, который выполняет fork() — полное копирование содержимого виртуальной памяти родительского процесса, копирование составляющих ядерного статического и динамического контекстов процесса-предка
  4. Увеличиваются счетчики открытия файлов (порожденный процесс наследует все открытые файлы родительского процесса).
  5. Возвращается PID в точку возврата из системного вызова в родительском процессе и 0 — в процессе-потомке.

Сигнал — способ информирования процесса ядром о происшествии какого-то события. Если возникает несколько однотипных событий, процессу будет подан только один сигнал. Сигнал означает, что произошло событие, но ядро не сообщает сколько таких событий произошло.

  1. окончание порожденного процесса (например, из-за системного вызова exit (см. ниже))
  2. возникновение исключительной ситуации
  3. сигналы, поступающие от пользователя при нажатии определенных клавиш.

Установить реакцию на поступление сигнала можно с помощью системного вызова signal
func = signal(snum, function);

snum — номер сигнала, а function — адрес функции, которая должна быть выполнена при поступлении указанного сигнала. Возвращаемое значение — адрес функции, которая будет реагировать на поступление сигнала. Вместо function можно указать ноль или единицу. Если был указан ноль, то при поступлении сигнала snum выполнение процесса будет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.

С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам.
kill(pid, snum);
где pid — идентификатор процесса, а snum — номер сигнала, который будет передан процессу. Обычно kill используется для того, чтобы принудительно завершить («убить») процесс.
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка, идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать -1, ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, который посылает сигнал.

Таблица 1. Номера сигналов

Номер Название Описание
01 SIGHUP Освобождение линии (hangup).
02 SIGINT Прерывание (interrupt).
03 SIGQUIT Выход (quit).
04 SIGILL Некорректная команда (illegal instruction). Не переустанавливается при перехвате.
05 SIGTRAP Трассировочное прерывание (trace trap). Не переустанавливается при перехвате.
06 SIGIOT или SIGABRT Машинная команда IOT.
07 SIGEMT Машинная команда EMT.
08 SIGFPE Исключительная ситуация при выполнении операции с вещественными числами (floating-point exception)
09 SIGKILL Уничтожение процесса (kill). Не перехватывается и не игнорируется.
10 SIGBUS Ошибка шины (bus error).
11 SIGSEGV Некорректное обращение к сегменту памяти (segmentation violation).
12 SIGSYS Некорректный параметр системного вызова (bad argument to system call).
13 SIGPIPE Запись в канал, из которого некому читать (write on a pipe with no one to read it).
14 SIGALRM Будильник
15 SIGTERM Программный сигнал завершения
16 SIGUSR1 Определяемый пользователем сигнал 1
17 SIGUSR2 Определяемый пользователем сигнал 2
18 SIGCLD Завершение порожденного процесса (death of a child).
19 SIGPWR Ошибка питания
22 Регистрация выборочного события

Сигналы (точнее их номера) описаны в файле singnal.h

Для нормального завершение процесса используется вызов
exit(status);
где status — это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например при выходе из функции main (при программировании на C) оператор return 0 будет воспринят как системный вызов exit(0);

Перенаправление ввода/вывода

Практически все операционные системы обладают механизмом перенаправления ввода/вывода. Linux не является исключением из этого правила. Обычно программы вводят текстовые данные с консоли (терминала) и выводят данные на консоль. При вводе под консолью подразумевается клавиатура, а при выводе — дисплей терминала.

Клавиатура и дисплей — это, соответственно, стандартный ввод и вывод (stdin и stdout). Любой ввод/вывод можно интерпретировать как ввод из некоторого файла и вывод в файл. Работа с файлами производится через их дескрипторы. Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 1), stdout (2) и stderr(3).

Читайте также:
Как удалить файл с троянской программой

Символ > используется для перенаправления стандартного вывода в файл.
Пример:
$ cat > newfile.txt Стандартный ввод команды cat будет перенаправлен в файл newfile.txt, который будет создан после выполнения этой команды. Если файл с этим именем уже существует, то он будет перезаписан. Нажатие Ctrl + D остановит перенаправление и прерывает выполнение команды cat.

Символ используется для присоединения данных в конец файла (append) стандартного вывода команды. Например, в отличие от случая с символом >, выполнение команды cat >> newfile.txt не перезапишет файл в случае его существования, а добавит данные в его конец.

Символ | используется для перенаправления стандартного вывода одной программы на стандартный ввод другой. Напрмер, ps -ax | grep httpd.

Команды для управления процессами

Предназначена для вывода информации о выполняемых процессах. Данная команда имеет много параметров, о которых вы можете прочитать в руководстве (man ps). Здесь я опишу лишь наиболее часто используемые мной:

Параметр Описание
-a отобразить все процессы, связанных с терминалом (отображаются процессы всех пользователей)
-e отобразить все процессы
-t список терминалов отобразить процессы, связанные с терминалами
-u идентификаторы пользователей отобразить процессы, связанные с данными идентификаторыми
-g идентификаторы групп отобразить процессы, связанные с данными идентификаторыми групп
-x отобразить все процессы, не связанные с терминалом

Например, после ввода команды ps -a вы увидите примерно следующее:

PID TTY TIME CMD 1007 tty1 00:00:00 bash 1036 tty2 00:00:00 bash 1424 tty1 00:00:02 mc 1447 pts/0 00:00:02 mpg123 2309 tty2 00:00:00 ps

Для вывода информации о конкретном процессе мы можем воспользоваться командой:

# ps -ax | grep httpd 698 ? S 0:01 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1261 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1262 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1263 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1264 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1268 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1269 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1270 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1271 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1272 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1273 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A 1280 ? S 0:00 httpd -DHAVE_PHP4 -DHAVE_PROXY -DHAVE_ACCESS -DHAVE_A

В приведенном выше примере используется перенаправление ввода вывода между программами ps и grep, и как результат получаем информацию обо всех процессах содержащих в строке запуска «httpd». Данную команду (ps -ax | grep httpd) я написал только лишь в демонстрационных целях — гораздо проще использовать параметр -С программы ps вместо перенаправления ввода вывода и параметр -e вместо -ax.

Программа top

Предназначена для вывода информации о процессах в реальном времени. Процессы сортируются по максимальному занимаемому процессорному времени, но вы можете изменить порядок сортировки (см. man top). Программа также сообщает о свободных системных ресурсах.

# top 7:49pm up 5 min, 2 users, load average: 0.03, 0.20, 0.11 56 processes: 55 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 7.6% user, 9.8% system, 0.0% nice, 82.5% idle Mem: 130660K av, 94652K used, 36008K free, 0K shrd, 5220K buff Swap: 72256K av, 0K used, 72256K free 60704K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 1067 root 14 0 892 892 680 R 2.8 0.6 0:00 top 1 root 0 0 468 468 404 S 0.0 0.3 0:06 init 2 root 0 0 0 0 0 SW 0.0 0.0 0:00 kflushd 3 root 0 0 0 0 0 SW 0.0 0.0 0:00 kupdate 4 root 0 0 0 0 0 SW 0.0 0.0 0:00 kswapd 5 root -20 -20 0 0 0 SW< 0.0 0.0 0:00 mdrecoveryd

Просмотреть информацию об оперативной памяти вы можете с помощью команды free, а о дисковой — df. Информация о зарегистрированных в системе пользователей доступна по команде w.

Изменение приоритета процесса — команда nice

nice [-коэффициент понижения] команда [аргумент]

Команда nice выполняет указанную команду с пониженным приоритетом, коэффициент понижения указывается в диапазоне 1..19 (по умолчанию он равен 10). Суперпользователь может повышать приоритет команды, для этого нужно указать отрицательный коэффициент, например —10. Если указать коэффициент больше 19, то он будет рассматриваться как 19.

nohup — игнорирование сигналов прерывания

nohup команда [аргумент]

nohup выполняет запуск команды в режиме игнорирования сигналов. Не игнорируются только сигналы SIGHUP и SIGQUIT.

kill — принудительное завершение процесса

kill [-номер сигнала] PID

где PID — идентификатор процесса, который можно узнать с помощью команды ps.

Команды выполнения процессов в фоновом режиме — jobs, fg, bg

Команда jobs выводит список процессов, которые выполняются в фоновом режиме, fg — переводит процесс в нормальные режим («на передний план» — foreground), а bg — в фоновый. Запустить программу в фоновом режиме можно с помощью конструкции https://www.opennet.ru/docs/RUS/lnx_process/process2.html» target=»_blank»]www.opennet.ru[/mask_link]

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru