Table Of ContentY
L
F
M
A
E
T
Team-Fly®
The Tomes of Kylix
™
The Linux API
®
Glenn Stephens
Wordware Publishing, Inc.
LibraryofCongressCataloging-in-PublicationData
Stephens,Glenn
ThetomesofKylix:theLinuxAPI/byGlennThomasStephens.
p. cm.
Includesbibliographicalreferencesandindex.
ISBN 1-55622-823-6(pbk.)
1. Applicationsoftware. 2. Kylix. 3. Linux. I. Title.
QA76.76.A65S762002
005.2’82--dc21 2001057353
CIP
©2002,WordwarePublishing,Inc.
AllRightsReserved
2320LosRiosBoulevard
Plano,Texas75074
Nopartofthisbookmaybereproducedinanyformorbyanymeans
withoutpermissioninwritingfromWordwarePublishing,Inc.
PrintedintheUnitedStatesofAmerica
ISBN1-55622-823-6
10 9 8 7 6 5 4 3 2 1
0111
KylixisatrademarkofBorlandSoftwareCorporation.
LinuxisaregisteredtrademarkofLinusTorvalds.
Other product names mentioned are used for identification purposes only and may be trademarks of their respective
companies.
AllinquiriesforvolumepurchasesofthisbookshouldbeaddressedtoWordwarePublishing,Inc.,attheabove
address.Telephoneinquiriesmaybemadebycalling:
(972)423-0090
Contents
Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
AbouttheAuthor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Chapter1 ALinuxAPIPrimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
LinuxHistory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Applications—WhatDevelopersDo. . . . . . . . . . . . . . . . . . . . . . . . . . 2
IntroducingtheLinuxAPI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
WhatisKylix?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
WhatWindowsHasThatLinuxDoesn’tandViceVersa. . . . . . . . . . . . . . . . 7
Chapter2 LinuxAPIErrors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
DealingwithLinuxAPIErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
SignalsasErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
LinuxAPIErrorFunctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
__errno_location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
perror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
strerror . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
LinuxAPIErrorCodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ErrorsareNotExceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Chapter3 LinuxInputandOutput . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
FileDescriptorsandStreams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
InputandOutputMethods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
OpeningandClosingFiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
ReadingandWritingFiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
StandardInput,StandardOutput,andStandardError. . . . . . . . . . . . . . . . . 33
ConvertingFileDescriptorstoFileStreamsandViceVersa . . . . . . . . . . . . . 34
TransferringHandlesbetweenKylixandtheAPIReference. . . . . . . . . . . . . 35
ConvertingaFileDescriptorintoaStream . . . . . . . . . . . . . . . . . . . . . . 36
FilePermissionsandOwnership. . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
GettingInformationandAttributesaboutaFile. . . . . . . . . . . . . . . . . . . . 42
ScanningFilesinaDirectory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
WorkingwithBuffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
FileOperations(Renaming,Copying). . . . . . . . . . . . . . . . . . . . . . . . . 46
TheioctlFunction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
CreatingLinks(ShortcutsforLinux) . . . . . . . . . . . . . . . . . . . . . . . . . 48
FileConventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
UnlockedFunctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
iii
iv (cid:1)
Contents
varargs—ANewDeclarationforKylix . . . . . . . . . . . . . . . . . . . . . . . 49
FileErrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
APIReference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
__chdir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
__close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
__mkdir. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
__read. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
__rename. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
__truncate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
__write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
alphasort,alphasort64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
chmod. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
clearerr,clearerr_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
closedir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
creat,creat64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
dirfd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
fchmod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
fclean. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
fclose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
fcloseall. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
fcntl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
fdopen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
feof,feof_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
ferror,ferror_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
fflush,fflush_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
fgetc,fgetc_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
fgetpos,fgetpos64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
fgets,fgets_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
fileno,fileno_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
fopen,fopen64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
fprintf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
fputc,fputc_unlocked,putc . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
fputs,fputs_unlocked. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
fread,fread_unlocked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
freopen,freopen64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
fseek,fseeko,fseeko64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
fsetpos,fsetpos64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
fstat,fstat64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
ftell,ftello,ftello64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
fwrite,fwrite_unlocked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
get_current_dir_name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
getc,getc_unlocked . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
getcwd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
getdelim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
getline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
getw. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
getwd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
ioctl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
(cid:1) v
Contents
lseek,lseek64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
lstat,lstat64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
open,open64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
open_memstream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
opendir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
pread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
putw. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
pwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
readdir,readdir64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
remove . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
rewind. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
rewinddir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
scandir,scandir64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
seekdir. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
setbuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
setbuffer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
setlinebuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
setvbuf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
stat,stat64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
telldir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
tempnam. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
tmpfile,tmpfile64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
tmpnam,tmpnam_r . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
ungetc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
versionsort,versionsort64. . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
PracticalExample—AdBaseIIIFileReader . . . . . . . . . . . . . . . . . . 122
WheretoGofromHere. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Chapter4 Processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
WhatisaProcess? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
GatheringInformationaboutaProcessunderLinux. . . . . . . . . . . . . . . . . 134
ProcessesandLinuxEnvironmentVariables. . . . . . . . . . . . . . . . . . . . . 136
AnEnvironmentExample. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
ForkingProcesses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
MakingUseoftheForkedProcess . . . . . . . . . . . . . . . . . . . . . . . . 142
ProcessGroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
WaitingonOtherProcesses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
TerminatingaProcess. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
ExecutingLinuxCommands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
UsingtheexecFunctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
EnumeratingUsersandGroupsfromwithinCode. . . . . . . . . . . . . . . . . . 153
RunningNormalAppswithPermissionoftheApp’sOwner . . . . . . . . . . . . 156
CreatingDaemonsforLinux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
APIReference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
__secure_getenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
clearenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
daemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
vi (cid:1)
Contents
endgrent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
endpwent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
execl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
execle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
execlp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
execv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
execve. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
execvp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
fexecve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
fork . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
getegid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
getenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
geteuid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
getgid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
getgrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
getgrgid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
getgrnam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
getgroups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
getpgid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
getpgrp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
getpid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
getppid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
getpwent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
getpwnam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
getpwuid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
getuid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
group_member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
putenv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
setegid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
setenv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
seteuid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
setgid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
setgrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
setpgid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
setpgrp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
setpwent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
setregid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
setreuid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
setuid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
system. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
unsetenv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
vfork. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
wait3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
wait4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
waitpid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
APracticalLookatProcesses—AServerHealthCheck. . . . . . . . . . . . . . 205
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
(cid:1) vii
Contents
Chapter5 InterprocessCommunication(IPC) . . . . . . . . . . . . . . . . . . . . . 211
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
TheNeedtoCommunicatebetweenProcesses. . . . . . . . . . . . . . . . . . . . 211
WhatMethodsareAvailabletoUs? . . . . . . . . . . . . . . . . . . . . . . . . . 212
AnIn-depthLookattheCommunicationMethods . . . . . . . . . . . . . . . . . 215
Signals—WhatareThey? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
CatchingaSignal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
SendingaSignaltoAnotherProcess. . . . . . . . . . . . . . . . . . . . . . 217
UsingSignalSets—The“Reliable”Method . . . . . . . . . . . . . . . . . 218
BlockingSignals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
UsingSignalswithinKylixApplications. . . . . . . . . . . . . . . . . . . . 223
ProgrammingPipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
NamedPipes—ABetterAlternative. . . . . . . . . . . . . . . . . . . . . . . 229
MessageQueues—ABetterWay . . . . . . . . . . . . . . . . . . . . . . . . 233
Semaphores—CommunicatingOperationStatusBetweenProcesses . . . . . 240
ProgrammingSemaphores . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
SharedMemory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
ProgrammingSharedMemory . . . . . . . . . . . . . . . . . . . . . . . . . 246
UsingSemaphoreswithSharedMemory. . . . . . . . . . . . . . . . . . . . 248
CreatingUniqueIPCKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
WhichMethodsWorkBestforDifferentKindsofApplications . . . . . . . . . . 254
APIReference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
__raise. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
alarm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
kill. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
killpg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
mkfifo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
msgctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
msgget. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
msgrcv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
msgsnd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
pause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
pclose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
pipe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
popen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
psignal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
semctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
semget. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
semop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
shmat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
shmctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
shmdt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
shmget. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
sigaction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
sigaddset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
sigandset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
sigdelset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
sigemptyset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
viii (cid:1)
Contents
sigfillset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
siggetmask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
sighold. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
sigignore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
sigisemptyset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
sigismember. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
sigorset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
__sigpause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
sigpending. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
sigprocmask. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
sigrelse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
sigset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
sigsuspend. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
sigwait. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
strsignal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
sigtimedwait. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
APracticalUse—AMessageQueueComponent . . . . . . . . . . . . . . . . . 295
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Chapter6 POSIXThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
WhatareThreads?—AnIntroduction. . . . . . . . . . . . . . . . . . . . . . . . 305
LinuxThreads—ThePOSIXStandardonLinux. . . . . . . . . . . . . . . . . 306
UnderstandingThreadswithinaKylixApplication . . . . . . . . . . . . . . . 306
ChoosingbetweenThreadsandProcesses . . . . . . . . . . . . . . . . . . . . . . 308
ErrorHandlingwiththePOSIXThreadFunctions . . . . . . . . . . . . . . . . . 309
ReentrantFunctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
CreatingThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
ThreadAttributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
WaitingforThreadstoFinish. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
KillingThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
SynchronizationMethodsUsingPOSIXThreads . . . . . . . . . . . . . . . . . . 319
Semaphores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
ConditionVariables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
ListenCarefully,IShallSayThisOnlypthread_once . . . . . . . . . . . . . . 335
OtherSynchronizationMethods. . . . . . . . . . . . . . . . . . . . . . . . . . 336
Thread-SpecificData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
SignalsandThreads. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
IntegratingwithCLX’sTThreadObject . . . . . . . . . . . . . . . . . . . . . . . 352
APIReference. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
__pthread_initialize. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
_pthread_cleanup_pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
_pthread_cleanup_pop_restore . . . . . . . . . . . . . . . . . . . . . . . . . 355
_pthread_cleanup_push. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
_pthread_cleanup_push_defer . . . . . . . . . . . . . . . . . . . . . . . . . 356
clone. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
GetCurrentThreadID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
(cid:1) ix
Contents
pthread_atfork. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
pthread_attr_destroy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
pthread_attr_getdetachstate. . . . . . . . . . . . . . . . . . . . . . . . . . . 361
pthread_attr_getguardsize. . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
pthread_attr_getinheritsched . . . . . . . . . . . . . . . . . . . . . . . . . . 362
pthread_attr_getschedparam . . . . . . . . . . . . . . . . . . . . . . . . . . 363
pthread_attr_getschedpolicy . . . . . . . . . . . . . . . . . . . . . . . . . . 364
pthread_attr_getscope. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
pthread_attr_getstack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
pthread_attr_getstackaddr. . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
pthread_attr_getstacksize. . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
pthread_attr_init. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
pthread_attr_setdetachstate. . . . . . . . . . . . . . . . . . . . . . . . . . . 368
pthread_attr_setguardsize. . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
pthread_attr_setinheritsched . . . . . . . . . . . . . . . . . . . . . . . . . . 369
pthread_attr_setschedparam . . . . . . . . . . . . . . . . . . . . . . . . . . 370
pthread_attr_setschedpolicy . . . . . . . . . . . . . . . . . . . . . . . . . . 371
pthread_attr_setscope. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
pthread_attr_setstack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
pthread_attr_setstackaddr. . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
pthread_attr_setstacksize . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
pthread_barrier_destroy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
pthread_barrier_init. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
pthread_barrier_wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
pthread_barrierattr_destroy. . . . . . . . . . . . . . . . . . . . . . . . . . . 376
pthread_barrierattr_getpshared . . . . . . . . . . . . . . . . . . . . . . . . . 377
pthread_barrierattr_init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
pthread_barrierattr_setpshared . . . . . . . . . . . . . . . . . . . . . . . . . 378
pthread_cancel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
pthread_cond_broadcast . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
pthread_cond_destroy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
pthread_cond_init. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
pthread_cond_signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
pthread_cond_timedwait . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
pthread_cond_wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
pthread_condattr_destroy. . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
pthread_condattr_getpshared . . . . . . . . . . . . . . . . . . . . . . . . . . 384
pthread_condattr_init . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
pthread_condattr_setpshared . . . . . . . . . . . . . . . . . . . . . . . . . . 385
pthread_create. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
pthread_detach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
pthread_equal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
pthread_exit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
pthread_getschedparam. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
pthread_getspecific . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
pthread_join. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
pthread_key_create . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
pthread_key_delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Description:This guide takes the Kylix developer through the core facets of Linux development from advanced file processing to Linux threading issues, including advanced Linux communication methods relative to the application programming interface.