Справочные материалы
Семафоры
#
InterProcessCommunication.Semaphore
— Type
Именованные семафоры
Semaphore(name, value; perms=0o600, volatile=true) -> sem
создает новый именованный семафор, идентифицируемый строкой name
вида "/somename"
и начальным значением value
. Возвращается экземпляр Semaphore{String}
. Для указания прав доступа можно использовать ключевое слово perms
. Ключевое слово volatile
указывает, должен ли семафор быть отсоединен после финализации возвращаемого объекта.
Semaphore(name) -> sem
открывает существующий именованный семафор и возвращает экземпляр Semaphore{String}
.
Чтобы отсоединить (удалить) постоянный именованный семафор, просто сделайте следующее:
rm(Semaphore, name)
Если семафор не существует, ошибка игнорируется. Однако для других ошибок выводится ошибка SystemError
.
Для максимальной гибкости экземпляр именованного семафора также может быть создан с помощью следующего:
open(Semaphore, name, flags, mode, value, volatile) -> sem
где для flags
могут быть заданы биты IPC.O_CREAT
и IPC.O_EXCL
, mode
определяет предоставленные права доступа, value
является начальным значением семафора, а volatile
представляет собой логическое значение, указывающее, должен ли семафор быть отсоединен после финализации возвращаемого объекта sem
. Значения mode
и value
игнорируются, если открыт существующий именованный семафор. Параметры разрешений в mode
маскируются под umask
процесса.
Анонимные семафоры
Анонимные семафоры поддерживаются объектами памяти, обеспечивающими необходимое хранение.
Semaphore(mem, value; offset=0, volatile=true) -> sem
инициализирует анонимный семафор, поддерживаемый объектом памяти mem
с начальным значением value
, и возвращает экземпляр Semaphore{typeof(mem)}
. Можно использовать ключевое слово offset
для указания адреса (в байтах) данных семафора относительно pointer(mem)
. Ключевое слово volatile
указывает, должен ли семафор быть уничтожен после финализации возвращаемого объекта.
Semaphore(mem; offset=0) -> sem
выдает экземпляр Semaphore{typeof(mem)}
, связанный с инициализированным анонимным семафором и поддерживаемым объектом памяти mem
в относительном расположении (в байтах), заданном ключевым словом offset
.
Количество байтов, необходимое для хранения анонимного семафора, задается с помощью sizeof(Semaphore)
, а анонимный семафор должен быть выровнен в памяти на величину, кратную размеру слова в байтах (то есть Sys.WORD_SIZE >> 3
). Объекты памяти, используемые для хранения анонимного семафора, должны реализовывать два метода: pointer(mem)
и sizeof(mem)
для получения базового адреса и размера (в байтах) связанной памяти соответственно.
#
Base.wait
— Method
wait(sem)
уменьшает значение семафора sem
(блокирует семафор). Если значение семафора больше нуля, уменьшение продолжается и функция немедленно возвращается. Если в данный момент семафор имеет нулевое значение, вызов блокируется до тех пор, пока либо не появится возможность выполнить уменьшение (т. е. значение семафора станет больше нуля), либо обработчик сигнала не прервет вызов (в этом случае будет выдан экземпляр исключения InterruptException
). В случае непредвиденной ошибки может возникнуть ошибка SystemError
.
#
Base.timedwait
— Method
timedwait(sem, secs)
уменьшает значение семафора sem
(блокирует семафор). Если значение семафора больше нуля, уменьшение продолжается и функция немедленно возвращается. Если в данный момент семафор имеет нулевое значение, вызов блокируется до тех пор, пока либо не появится возможность выполнить уменьшение (т. е. значение семафора станет больше нуля), либо не истечет ограничение в заданное количество секунд secs
(в этом случае будет выдан экземпляр исключения TimeoutError
), либо обработчик сигнала не прервет вызов (в этом случае будет выдан экземпляр исключения InterruptException
).
#
InterProcessCommunication.trywait
— Method
trywait(sem) -> boolean
предпринимает попытку немедленного уменьшения значения (блокировки) семафора sem
с возвращением true
в случае успеха. Если уменьшение не может быть выполнено сразу же, вызов возвращает false
. В случае прерывания или непредвиденной ошибки возникает исключение (InterruptException
или SystemError
соответственно).
Общая память
SharedMemory(id, len; perms=0o600, volatile=true)
выдает новый объект общей памяти, идентифицируемый по id
, размер которого равен len
байт. Идентификатор id
может быть строкой, начинающейся с символа '/'
, для создания объекта общей памяти POSIX или ключом IPC System V для создания сегмента общей памяти BSD System V. В последнем случае ключ может представлять собой IPC.PRIVATE
, чтобы автоматически создать несуществующий сегмент общей памяти.
Используйте ключевое слово perms
, чтобы указать предоставляемые права доступа. По умолчанию пользователю разрешено выполнять только чтение и запись.
Используйте ключевое слово volatile
, чтобы указать, является общая память непостоянной или нет. Если память является постоянной, она будет доступна до явного уничтожения или перезагрузки системы. По умолчанию общая память уничтожается, если она больше не используется.
Чтобы получить существующий объект общей памяти, вызовите следующее:
SharedMemory(id; readonly=false)
где id
— это идентификатор общей памяти (строка, ключ IPC или идентификатор IPC System V сегмента общей памяти System V, возвращаемый ShmId
). Ключевому слову readonly
можно задать значение true, если требуется доступ только для чтения. Обратите внимание, что можно вызвать метод shmid(obj)
для получения идентификатора объекта общей памяти obj
.
Некоторые методы расширены для объектов общей памяти. Если предположить, что shm
является экземпляром SharedMemory
, то:
pointer(shm) # выдает базовый адрес общей памяти
sizeof(shm) # выдает количество байтов общей памяти
shmid(shm) # выдает идентификатор общей памяти
Чтобы убедиться, что объект общей памяти shm
в конце концов будет уничтожен, вызовите следующее:
rm(shm)
#
InterProcessCommunication.ShmId
— Type
Получает идентификатор сегмента общей памяти System V
Следующие вызовы:
ShmId(id) -> id
ShmId(arr) -> id
ShmId(key, readlony=false) -> id
выдают идентификатор сегмента общей памяти System V, связанного со значением первого аргумента. id
является идентификатором сегмента общей памяти, arr
является массивом, присоединенным к сегменту общей памяти System V, а key
является ключом, связанным с сегментом общей памяти. В последнем случае readlony
можно задать значение true
, чтобы запрашивать доступ только для чтения. В противном случае будет запрашиваться доступ для чтения и записи.
#
InterProcessCommunication.ShmInfo
— Type
ShmInfo
представляет собой структуру, используемую для хранения информации о сегменте общей памяти System V. Вызов ShmInfo(arg)
эквивалентен shminfo(arg)
.
#
InterProcessCommunication.shmid
— Function
shmid(arg)
выдает идентификатор существующего объекта общей памяти POSIX или сегмент общей памяти Sytem V, идентифицируемый по arg
или связанный с arg
. Аргумент может представлять собой следующее:
-
Экземпляр
SharedMemory
-
Экземпляр
WrappedArray
, содержимое которого хранится в общей памяти -
Строка, начинающаяся с
'/'
(и без других'/'
) для идентификации объекта общей памяти POSIX -
Экземпляр
IPC.Key
для указания ключа IPC System V, связанного с сегментом общей памяти. В этом случае необязательному второму аргументуreadonly
можно задать значениеtrue
, чтобы запрашивать доступ только для чтения. В противном случае будет запрашиваться доступ для чтения и записи -
Экземпляр
ShmId
для указания сегмента общей памяти System V
См. также описание SharedMemory
, shmrm
.
#
InterProcessCommunication.shmget
— Function
Получает или создает сегмент общей памяти System V
Вызов:
shmget(key, siz, flg) -> id
выдает идентификатор сегмента общей памяти, связанного со значением аргумента key
. Новый сегмент общей памяти, размер которого равен значению siz
(возможно, округленному до кратного размера страницы памяти IPC.PAGE_SIZE
), создается, если key
имеет значение IPC.PRIVATE
или key
не является IPC.PRIVATE
, сегмент общей памяти, соответствующий key
, не существует, а IPC_CREAT
указан в аргументе flg
.
Аргументы:
-
key
является ключом IPC System V, связанным с сегментом общей памяти. -
siz
задает размер (в байтах) сегмента общей памяти (может быть округлен до кратного размера страницы памяти). -
flg
представляет собой битовую комбинацию флагов. Наименее значимые 9 бит определяют разрешения, предоставленные владельцу, группе и другим. Эти биты имеют тот же формат и то же значение, что и аргумент modechmod
. Для создания нового сегмента можно задать битIPC_CREAT
. Если этот флаг не используется,shmget
найдет сегмент, связанный сkey
, и проверит, есть ли у пользователя разрешение на доступ к этому сегменту. БитIPC_EXCL
можно задать дополнительно кIPC_CREAT
, чтобы гарантировать, что этот вызов создаст сегмент. Если задан иIPC_EXCL
, иIPC_CREAT
, вызов завершится неудачей, если сегмент уже существует.
#
InterProcessCommunication.shmat
— Function
shmat(id, readonly) -> ptr
присоединяет сегмент общей памяти к адресному пространству вызывающего объекта. Аргумент id
является идентификатором сегмента общей памяти. Логический аргумент readonly
указывает, следует ли присоединять сегмент для доступа только для чтения. В противном случае сегмент присоединяется для доступа для чтения и записи и процесс должен иметь разрешения на чтение и запись для сегмента. Возвращаемое значение представляет собой указатель на доступ к сегменту общей памяти.
#
InterProcessCommunication.shmrm
— Function
shmrm(arg)
удаляет общую память, связанную с arg
. Если arg
является именем, соответствующая именованная общая память POSIX будет отсоединена. Если arg
является ключом или идентификатором сегмента общей памяти BSD, сегмент помечается как подлежащий уничтожению. Аргумент arg
также может быть объектом SharedMemory
.
Можно также вызвать метод rm
для удаления существующего сегмента или объекта общей памяти. Есть несколько возможностей:
rm(SharedMemory, name) # `name` идентифицирует объект общей памяти POSIX
rm(SharedMemory, key) # `key` связан с сегментом общей памяти BSD
`id` является идентификатором сегмента общей памяти BSD
rm(shm) # `shm` является экземпляром `SharedMemory`
См. также описание SharedMemory
, shmid
, shmat
.
#
InterProcessCommunication.shmctl
— Function
shmctl(id, cmd, buf)
performs the control operation specified by cmd
on the System V shared memory segment whose identifier is given in id
. The buf
argument is a byte array large enough to store a shmid_ds
C structure.
#
InterProcessCommunication.shmcfg
— Function
shmcfg(arg, perms) -> id
изменяет права доступа сегмента общей памяти IPC System V. Аргумент perms
задает битовые флаги с новыми разрешениями. Первым аргументом arg
может быть идентификатор сегмента общей памяти, общий массив, присоединенный к сегменту общей памяти, или ключ IPC System V, связанный с сегментом общей памяти. Во всех случаях возвращается идентификатор сегмента общей памяти.
См. также описание ShmId
, shmget
, shmctl
и SharedMemory
.
#
InterProcessCommunication.shminfo
— Function
shminfo(arg) -> info
выводит сведения о сегменте общей памяти System V, который идентифицируется или связан с arg
, которым может быть идентификатор сегмента общей памяти, общий массив, присоединенный к сегменту общей памяти, или ключ IPC System V, связанный с сегментом общей памяти.
См. также описание ShmInfo
, ShmId
, shmget
, shmat
, SharedMemory
.
Сигналы
#
InterProcessCommunication.SigSet
— Type
SigSet
представляет структуру C sigset_t
. Ее следует рассматривать как непрозрачную, ее содержимое хранится в виде кортежа целых чисел без знака, размер которых совпадает с размером sigset_t
.
Схема стандартного использования выглядит так:
sigset = SigSet()
sigset[signum] -> boolean
sigset[signum] = boolean
fill!(sigset, boolean) -> sigset
где signum
является номером сигнала, целым числом, большим или равным 1
и меньшим или равным IPC.SIGRTMAX
. Сигналы реального времени имеют номер signum
, так что IPC.SIGRTMIN ≤ signum ≤ IPC.SIGRTMAX
Неэкспортируемые методы:
IPC.sigfillset!(sigset) # то же, что и fill!(signum, true)
IPC.sigemptyset!(sigset) # то же, что и fill!(signum, false)
IPC.sigaddset!(sigset, signum) # то же, что и sigset[signum] = true
IPC.sigdelset!(sigset, signum) # то же, что и sigset[signum] = false
IPC.sigismember(sigset, signum) # то же, что и sigset[signum]
#
InterProcessCommunication.SigAction
— Type
SigAction
является аналогом структуры C struct sigaction
. Используется для указания действий, выполняемых процессом при получении сигнала. Если предположить, что sa
является экземпляром SigAction
, у него есть следующие поля:
sa.handler # адрес обработчика сигналов
sa.mask # маска блокируемых сигналов
sa.flags # битовые флаги
где sa.handler
— это адрес функции C (может быть SIG_IGN
или SIG_DFL
), вызываемой при получении сигнала. Функцию можно задать с помощью cfunction
. Если IPC.SA_INFO
не задан в sa.flags
, сигнатура обработчика выглядит следующим образом:
function handler(signum::Cint)::Nothing
это функция, которая принимает один аргумент типа Cint
и ничего не возвращает. Если IPC.SA_INFO
не задан в sa.flags
, сигнатура обработчика выглядит следующим образом:
function handler(signum::Cint, siginf::Ptr{SigInfo}, unused::Ptr{Cvoid})::Nothing
это функция, которая принимает три аргумента типа Cint
, Ptr{SigInfo}
, Ptr{Cvoid}
соответственно и ничего не возвращает. См. описание SigInfo
, содержащее сведения об аргументе siginf
для обработчика.
Вызовите следующее:
sa = SigAction()
чтобы создать новую пустую структуру, или
sa = SigAction(handler, mask, flags)
чтобы указать все поля.
См. также SigInfo
, sigaction
и sigaction!
.
#
InterProcessCommunication.SigInfo
— Type
SigInfo
представляет структуру C siginfo_t
. Ее следует рассматривать как непрозрачную, ее содержимое хранится в виде кортежа целых чисел без знака, размер которых совпадает с размером siginfo_t
, но, в принципе, обработчик сигналов, установленный с флагом SA_SIGINFO
, должен получать только указатель.
При заданном ptr
, экземпляре Ptr{SigInfo}
, полученном обработчиком сигналов, элементы соответствующей структуры C siginfo_t
извлекаются следующим образом:
IPC.siginfo_signo(ptr) # Номер сигнала.
IPC.siginfo_code(ptr) # Код сигнала.
IPC.siginfo_errno(ptr) # Если значение ненулевое, значение errno, связанное с этим
# сигналом.
IPC.siginfo_pid(ptr) # Идентификатор отправляющего процесса.
IPC.siginfo_uid(ptr) # Идентификатор реального пользователя отправляющего процесса.
IPC.siginfo_addr(ptr) # Адрес инструкции, приводящей к ошибке.
IPC.siginfo_status(ptr) # Значение или сигнал выхода.
IPC.siginfo_band(ptr) # Ленточное событие для SIGPOLL.
IPC.siginfo_value(ptr) # Значение сигнала.
Эти методы небезопасны, так как они используют адрес напрямую. Поэтому они не экспортируются по умолчанию. В зависимости от контекста не все элементы siginfo_t
имеют значение (кроме того, они могут быть определены как объединение и, таким образом, перекрываться в памяти). На данный момент доступны только те элементы, которые определены стандартом POSIX. Наконец, значение, заданное с помощью IPC.siginfo_value(ptr)
, представляет тип C union sigval
(объединение C int
и C void*
). В Julia оно возвращается (и задается в sigqueue
) как целое число, достаточно большое, чтобы представлять оба типа значений.
#
InterProcessCommunication.sigaction
— Function
sigaction(signum) -> sigact
выдает текущее действие (экземпляр SigAction
), выполняемое процессом при получении сигнала signum
.
sigaction(signum, sigact)
устанавливает sigact
(экземпляр SigAction
) в качестве действия, выполняемого процессом при получении сигнала signum
.
Обратите внимание, что signum
не может быть ни SIGKILL
, ни SIGSTOP
.
См. также описание SigAction
и sigaction!
.
#
InterProcessCommunication.sigaction!
— Function
sigaction!(signum, sigact, oldact) -> oldact
устанавливает sigact
в качестве действия, выполняемого процессом при получении сигнала signum
, перезаписывает oldact
предыдущим действием и возвращает его. Аргументы sigact
и oldact
являются экземплярами SigAction
.
#
InterProcessCommunication.sigpending
— Function
sigpending() -> mask
выдает набор сигналов,которые ожидают доставки в вызывающий поток (т. е. сигналы, которые выпущены во время блокировки). Возвращаемое значение представляет собой экземпляр SigSet
.
См. также описание sigpending!
.
#
InterProcessCommunication.sigpending!
— Function
sigpending!(mask) -> mask
перезаписывает маску (mask
) набором ожидающих сигналов и возвращает ее аргумент.
См. также описание sigpending
.
#
InterProcessCommunication.sigprocmask
— Function
sigprocmask() -> cur
выдает текущий набор заблокированных сигналов. Чтобы изменить набор заблокированных сигналов, вызовите следующее:
sigprocmask(how, set)
с набором (set
) маски SigSet
и параметром how
, который указывает, как интерпретировать set
:
-
IPC.SIG_BLOCK
: набор заблокированных сигналов — это объединение текущего набора и аргументаset
. -
IPC.SIG_UNBLOCK
: сигналы вset
удаляются из текущего набора заблокированных сигналов. Разрешается попытаться разблокировать сигнал, который не заблокирован. -
IPC.SIG_SETMASK
: набор заблокированных сигналов задан для аргументаset
.
См. также описание sigprocmask!
.
#
InterProcessCommunication.sigprocmask!
— Function
sigprocmask!(cur) -> cur
перезаписывает cur
(экземпляр SigSet
) текущим набором заблокированных сигналов и возвращает его. Чтобы изменить набор заблокированных сигналов, вызовите следующее:
sigprocmask!(how, set, old) -> old
изменяет набор заблокированных сигналов согласно how
и set
(см. описание sigprocmask
), перезаписывает old
(экземпляр SigSet
) предыдущим набором заблокированных сигналов и возвращает old
.
См. также описание sigprocmask
.
#
InterProcessCommunication.sigqueue
— Function
sigqueue(pid, sig, val=0)
отправляет сигнал sig
в процесс с идентификатором pid
. Аргумент val
является необязательным значением для присоединения к сигналу. Это значение представляет тип C union sigval
(объединение C int
и C void*
). В Julia оно указывается как целое число, достаточно большое, чтобы представлять оба типа значений.
#
InterProcessCommunication.sigsuspend
— Function
sigsuspend(mask)
временно заменяет маску сигнала вызывающего процесса на маску, заданную с помощью mask
, а затем приостанавливает процесс до получения сигнала, действие которого заключается в вызове обработчика сигналов или завершении процесса.
Если сигнал завершает процесс, sigsuspend
не возвращается. Если сигнал перехватывается, sigsuspend
возвращается после возврата обработчика сигналов и маска сигнала восстанавливается до состояния, предшествующего вызову sigsuspend
.
Невозможно заблокировать IPC.SIGKILL
или IPC.SIGSTOP
. Указание этих значений в маске не влияет на маску сигнала процесса.
#
InterProcessCommunication.sigwait
— Function
sigwait(mask, timeout=Inf) -> signum
приостанавливает выполнение вызывающего потока до тех пор, пока один из сигналов, указанных в mask
набора сигналов, не будет находиться в состоянии ожидания. Функция принимает сигнал (удаляет его из списка ожидающих сигналов) и возвращает номер сигнала signum
.
Можно указать необязательный аргумент timeout
, чтобы задать ограничение на время ожидания, пока один из сигналов не перейдет в состояние ожидания. timeout
может быть вещественным числом для указания количества секунд или экземпляром TimeSpec
. Если timeout
имеет значение Inf
(по умолчанию), предполагается, что время ожидания не ограничено. Если значение timeout
меньше нуля или равно ему или если timeout
имеет значение TimeSpec(0,0)
, методы выполняют опрос и сразу же возвращаются. Если в течение допустимого времени ожидания ни один из сигналов, указанных в mask
набора сигналов не перейдет в режим ожидания, выдается исключение TimeoutError
.
См. также описание sigwait!
, TimeSpec
, TimeoutError
.
Массивы, заключенные в оболочку
#
InterProcessCommunication.WrappedArray
— Type
WrappedArray(mem, [T [, dims...]]; offset=0)
выдает массив Julia, элементы которого хранятся в объекте «память» mem
. Аргумент T
— это тип данных элементов возвращаемого массива, а аргументы dims
указывают измерения массива. Если dims
пропущен, результатом является вектор максимальной длины (с учетом смещения и размера объекта mem
). Если T
опущен, предполагается, что используется UInt8
.
Можно использовать ключевое слово offset
для указания адреса (в байтах) относительно pointer(mem)
, где хранится первый элемент массива.
Размер памяти, задаваемый с помощью mem
, должен быть достаточным для хранения всех элементов (с учетом смещения), а выравнивание элементов в памяти должно быть кратно Base.datatype_alignment(T)
.
Вот другая возможность:
WrappedArray(mem, dec)
где mem
— это объект «память», а dec
— функция, отвечающая за декодирование типа и структуры массива, заданного объектом памяти. Декодер применяется к объекту памяти следующим образом:
dec(mem) -> T, dims, offset
при этом должен выдаваться тип данных T
элементов массива, измерения dims
массива и смещение первого элемента относительно pointer(mem)
.
Ограничения
Объект mem
должен расширять методы pointer(mem)
и sizeof(mem)
, которые должны соответственно выдавать базовый адрес памяти, предоставляемой mem
, и количество доступных байтов. Кроме того, предполагается, что эта память будет доступна по крайней мере до тех пор, пока объект mem
не будет удален сборщиком мусора.
Массивы общей памяти
WrappedArray(id, T, dims; perms=0o600, volatile=true)
создает новый заключенный в оболочку массив, элементы которого (и заголовок) хранятся в общей памяти, идентифицируемой по id
(см. раздел о SharedMemory
с описанием id
и ключевых слов). Чтобы получить этот массив в другом процессе, просто сделайте следующее:
WrappedArray(id; readonly=false)
См. также описание
Служебные программы
#
InterProcessCommunication.TimeSpec
— Type
TimeSpec(sec, nsec)
выдает экземпляр TimeSpec
для целого числа секунд sec
и целого числа наносекунд nsec
с начала эпохи.
TimeSpec(sec)
выдает экземпляр TimeSpec
для, возможно, дробного числа секунд sec
с начала эпохи. Аргумент также может быть экземпляром TimeVal
.
Вызовите now(TimeSpec)
, чтобы получить текущее время как экземпляр TimeSpec
.
При сложении и вычитании с участием экземпляра TimeSpec
выдается результат TimeSpec
. Пример:
now(TimeSpec) + 3.4
выдает экземпляр TimeSpec
с текущим временем плюс 3.4
с.
typemin(TimeSpec)
typemax(TimeSpec)
соответственно, выдает минимальное и максимальное нормированные значения времени для экземпляра TimeSpec
.
#
InterProcessCommunication.TimeVal
— Type
TimeVal(sec, usec)
выдает экземпляр TimeVal
для целого числа секунд sec
и целого числа микросекунд usec
с начала эпохи.
TimeVal(sec)
выдает экземпляр TimeVal
с, возможно, дробным числом секунд sec
с начала эпохи. Аргумент также может быть экземпляром TimeSpec
.
Вызовите now(TimeVal)
, чтобы получить текущее время как экземпляр TimeVal
.
При сложении и вычитании с участием экземпляра TimeVal
выдается результат TimeVal
. Пример:
now(TimeVal) + 3.4
выдает экземпляр TimeVal
с текущим временем плюс 3.4
с.
typemin(TimeVal)
typemax(TimeVal)
соответственно, выдает минимальное и максимальное нормированные значения времени для экземпляра TimeVal
.
#
InterProcessCommunication.clock_getres
— Function
clock_getres(id) -> ts
выдает разрешение (точность) указанных часов id
. Результатом является экземпляр IPC.TimeSpec
. Идентификатор часов id
может иметь значение CLOCK_REALTIME
или CLOCK_MONOTONIC
(см. описание clock_gettime
).
См. также описание clock_gettime
, clock_settime
, gettimeofday
, nanosleep
, IPC.TimeSpec
и IPC.TimeVal
.
#
InterProcessCommunication.clock_gettime
— Function
clock_gettime(id) -> ts
выдает время указанных часов id
. Результатом является экземпляр IPC.TimeSpec
. Идентификатор часов id
может иметь одно из следующих значений:
-
CLOCK_REALTIME
: общесистемные часы, измеряющие реальное (т. е. физическое) время. На эти часы влияют периодические скачки системного времени (например, если системный администратор вручную переводит часы), а также инкрементные корректировки, выполняемые с помощьюadjtime
и NTP. -
CLOCK_MONOTONIC
: часы, которые нельзя настроить и которые показывают монотонное время с некоторой неопределенной начальной точки. На эти часы не влияют периодические скачки системного времени.
См. также описание clock_getres
, clock_settime
, gettimeofday
, nanosleep
, IPC.TimeSpec
и IPC.TimeVal
.
#
InterProcessCommunication.clock_settime
— Function
clock_settime(id, ts)
задает время указанного id
часов как ts
. Аргумент ts
может быть экземпляром IPC.TimeSpec
или количеством секунд. Идентификатор часов id
может иметь значение CLOCK_REALTIME
или CLOCK_MONOTONIC
(см. описание clock_gettime
).
См. также описание clock_getres
, clock_gettime
, gettimeofday
, nanosleep
, IPC.TimeSpec
и IPC.TimeVal
.
#
InterProcessCommunication.gettimeofday
— Function
gettimeofday() -> tv
выдает текущее время как экземпляр IPC.TimeVal
. Результат можно преобразовать в дробное число секунд путем вызова float(tv)
.
См. также описание IPC.TimeVal
, nanosleep
, clock_gettime
.
#
InterProcessCommunication.nanosleep
— Function
nanosleep(t) -> rem
спит в течение t
секунд с точностью до наносекунды и возвращает оставшееся время (в случае прерываний) как экземпляр IPC.TimeSpec
. Аргумент может быть (дробным) числом секунд или экземпляром IPC.TimeSpec
или IPC.TimeVal
.
Метод sleep
, предоставляемый Julia, имеет только миллисекундную точность.
См. также описание gettimeofday
, IPC.TimeSpec
и IPC.TimeVal
.
#
InterProcessCommunication.umask
— Function
umask(msk) -> old
задает в качестве маски создания файлового режима вызывающего процесса (umask
) значение msk & 0o0777
(т. е. используются только биты разрешения файла в маске) и возвращает предыдущее значение маски.
См. также описание IPC.maskmode
.
#
InterProcessCommunication.maskmode
— Function
IPC.maskmode(mode)
возвращает биты IPC.MASKMODE
для mode
, преобразованные в тип C mode_t
.
Константа IPC.MASKMODE = 0o777
представляет собой битовую маску для предоставленных прав доступа (обычно устанавливается 9 наименее значимых бит).
См. также описание umask
.
Исключения
#
InterProcessCommunication.TimeoutError
— Type
TimeoutError
используется для выдачи исключения времени ожидания.