Правильно. Если exec
работает, perror
не будет вызываться, просто потому, что вызов perror
больше не существует.
Я считаю, что иногда легче обучать новичков этим понятиям, думать модель исполнения UNIX состоит из процессов , программ и .
Программы являются исполняемыми файлами, такими как /bin/ls
или /sbin/fdisk
(обратите внимание, что это не включает такие вещи, как bash
или скрипты Python, поскольку в этом случае фактическим исполняемым файлом будет интерпретатор bash
или python
, а не сценарий).
Экземпляры программы - это программы, которые были загружены в память и в основном запущены. Хотя есть только одна программа, такая как /bin/ls
, может быть несколько экземпляров ее работы в любой момент времени, если, например, вы и я запускаем ее одновременно.
Эта фраза «загружена в память» где процессы вступают в картину. Процессы - это просто «контейнеры», в которых могут запускаться экземпляры программ.
Итак, когда вы fork
процесс, вы получаете два различных процесса, но они все еще каждый из которых запускает отдельные экземпляры программы той же . Вызов fork
часто упоминается как тот, который один процесс вызывает, но два процесса возвращаются.
Аналогично, exec
не будет влиять на сам процесс, но он будет отбросить текущий экземпляр программы в этом процессе и запустить новый экземпляр запрошенной программы.
Этот сброс в успешном вызове exec
- это то, что диктует, что следующий за ним код (perror
случай) не будет вызываться.
Короче говоря : эти опции вы можете передать в CharField
[Django-doc] и, в некоторой степени, Field
[Джанго-док] .
SlugField
- это класс, который расширяет класс CharField
, это можно увидеть в исходном коде [GitHub] :
blockquote> [ 1127] Таким образом, он устанавливаетclass SlugField(CharField): default_validators = [validators.validate_slug] description = _("Slug (up to %(max_length)s)") def __init__(self, *args, max_length=50, db_index=True, allow_unicode=False, **kwargs): self.allow_unicode = allow_unicode if self.allow_unicode: self.default_validators = [validators.validate_unicode_slug] super().__init__(*args, max_length=max_length, db_index=db_index, **kwargs) #...
max_length
по умолчанию на50
,db_index
наTrue
иallow_unicode
наFalse
и передает все позиционные и именованные аргументы супер-конструктору (одному изCharField
].
Класс
CharField
также передает аргументы своему суперконструктору в соответствии с исходным кодом [GitHub] :blockquote >class CharField(Field): description = _("String (up to %(max_length)s)") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.validators.append(validators.MaxLengthValidator(self.max_length))
Это означает, что все сводится к опциям , которые можно передать любому
Field
[Django-doc] . Например:db_column
,default
editable
,help_text
и т. Д.