Y 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: