CTRL C не убивает скрипт C

#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 C

4. Но почему это происходит в фоновом режиме по умолчанию?

5. Команды могут быть завершены с помощью ; или amp; . Значение по умолчанию равно ; (что необязательно): cmd и cmd ; будет запускать команду на переднем плане. cmd amp; будет запускать его в фоновом режиме. Когда вы писали ./mem amp; ./mem , это было похоже на ввод ./mem amp; ./mem ; текста — первый выполняется в фоновом режиме, второй — на переднем плане.