📄 reent.tex
字号:
@node Reentrancy@chapter Reentrancy@cindex reentrancyReentrancy is a characteristic of library functions which allows multipleprocesses to use the same address space with assurance that the values storedin those spaces will remain constant between calls. Cygnus's implementationof the library functions ensures that whenever possible, these library functions are reentrant. However,there are some functions that can not be trivially made reentrant.Hooks have been provided to allow you to use these functions in a fullyreentrant fashion.@findex _reent@findex reent.h@cindex reentrancy structureThese hooks use the structure @code{_reent} defined in @file{reent.h}.A variable defined as @samp{struct _reent} is called a @dfn{reentrancystructure}. All functions which must manipulate global information areavailable in two versions. The first version has the usual name, anduses a single global instance of the reentrancy structure. The secondhas a different name, normally formed by prepending @samp{_} andappending @samp{_r}, and takes a pointer to the particular reentrancystructure to use.For example, the function @code{fopen} takes two arguments, @var{file}and @var{mode}, and uses the global reentrancy structure. The function@code{_fopen_r} takes the arguments, @var{struct_reent}, which is apointer to an instance of the reentrancy structure, @var{file}and @var{mode}. @cindex global reentrancy structure@findex _impure_ptrEach function which uses the global reentrancy structure uses the globalvariable @code{_impure_ptr}, which points to a reentrancy structure.This means that you have two ways to achieve reentrancy. Both requirethat each thread of execution control initialize a unique globalvariable of type @samp{struct _reent}:@enumerate@item@cindex extra argument, reentrant fnsUse the reentrant versions of the library functions, after initializinga global reentrancy structure for each process. Use the pointer to thisstructure as the extra argument for all library functions.@itemEnsure that each thread of execution control has a pointer to its ownunique reentrancy structure in the global variable @code{_impure_ptr},and call the standard library subroutines.@end enumerate@cindex list of reentrant functions@cindex reentrant function listThe following functions are provided in both reentrantand non-reentrant versions.@example@exdent @emph{Equivalent for errno variable:}_errno_r@exdent @emph{Locale functions:}_localeconv_r _setlocale_r@exdent @emph{Equivalents for stdio variables:}_stdin_r _stdout_r _stderr_r@page @exdent @emph{Stdio functions:}_fdopen_r _mkstemp_r _remove_r_fopen_r _mktemp_r _rename_r_getchar_r _perror_r _tempnam_r_gets_r _putchar_r _tmpnam_r _iprintf_r _puts_r _tmpfile_r@exdent @emph{Signal functions:}_raise_r _signal_r@exdent @emph{Stdlib functions:}@c FIXME! dtoa undoc; should _dtoa_r be mentioned?_dtoa_r _realloc_r _strtoul_r_free_r _srand_r _system_r_malloc_r _strtod_r_rand_r _strtol_r@exdent @emph{String functions:}_strtok_r@exdent @emph{System functions:}_close_r _lseek_r _stat_r_fork_r _open_r _unlink_r_fstat_r _read_r _wait_r_link_r _sbrk_r _write_r@exdent @emph{Time function:}_asctime_r@end example
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -