#c #bash #kill
Вопрос:
Я читаю «Операционные системы: три простых фрагмента» и нахожу проблему, о которой в книге не упоминается.
Это сценарий на языке Си:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
/*#include "common.h"*/
#include <unistd.h>
#include <assert.h>
int
main(int argc, char *argv[])
{
int *p = malloc(sizeof(int));
assert(p != NULL);
printf("(%d address pointed to by p: %pn",
getpid(), p);
*p = 0;
while (1) {
sleep(1);
*p = *p 1;
printf("(%d) p: %dn", getpid(), *p);
}
return 0;
}
Он выделяет некоторую память, распечатывает адресную память, помещает в нее число 0 и, наконец, выполняет цикл для увеличения значения.
Я компилирую его, gcc -o mem mem.c -Wall
и у меня нет проблем с его запуском ./mem
, если я нажму CRTL C, он остановится:
Но тогда возникают проблемы, когда я запускаю скрипт дважды параллельно с командой ./mem amp; ./mem
, посмотрите на GIF:
Независимо от того, сколько раз я пытаюсь остановить процесс, скрипты продолжают работать.
Как убить мой проект C which?
Комментарии:
1. Помимо того, что
getpid()
может вернуть что-то более широкое, чемint
, рассмотрите приведение:printf("%dn", (int) getpid());
убрать этот потенциальный UB с пути демонстрации этой проблемы.
Ответ №1:
Используйте fg
, чтобы вывести фоновый процесс на передний план, тогда он будет реагировать наCtrl-C.
Вы также можете использовать jobs
для просмотра нумерованного списка фоновых заданий и kill %<number>
для завершения определенного задания, например kill %1
.
Комментарии:
1. Как я могу написать fg, пока терминал занят этим процессом?
2. Притворись, что его там нет. Оболочка по-прежнему будет принимать ваши входные данные.
3. Спасибо @John, это сработало
fg
, а затем CTRL C4. Но почему это происходит в фоновом режиме по умолчанию?
5. Команды могут быть завершены с помощью
;
илиamp;
. Значение по умолчанию равно;
(что необязательно):cmd
иcmd ;
будет запускать команду на переднем плане.cmd amp;
будет запускать его в фоновом режиме. Когда вы писали./mem amp; ./mem
, это было похоже на ввод./mem amp; ./mem ;
текста — первый выполняется в фоновом режиме, второй — на переднем плане.