|
пример из книги Стивенса Unix Network Programming
#36900506
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
|
Здравствуйте!
Есть немного изменённый пример из книги Стивенса.
Код вот такой
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
#include "unpipc.h"
int main(int argc, char** argv)
{
int c, id, oflag;
char* ptr;
size_t length;
oflag = SVSHM_MODE | IPC_CREAT;
while ((c = Getopt(argc, argv, "e")) != - 1 )
{
switch(c)
{
case 'e':
oflag |= IPC_EXCL;
break;
}
}
if (optind != argc - 2 )
err_quit("usage: shmget [ -e ] <pathname> <length>");
length = atoi(argv[optind + 1 ]);
id = Shmget(ftok(argv[optind], 0 ), length, oflag);
ptr = shmat(id, NULL, 0 );
exit( 0 );
}
Этот код использует хидер unpipc.h, который идёт ко всем примерам этой книги.
Сам хидер имеет следующий вид
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381.
//lib/unpipc.h
/* Íàø çàãîëîâî÷íûé ôàéë. */
#ifndef __unpipc_h
#define __unpipc_h
#include "../config.h" /* ïàðàìåòðû êîíôèãóðàöèè ÎÑ */
/* "../config.h" ñîçäàåòñÿ ñöåíàðèåì configure */
/* èçìåíÿÿ ñïèñîê äèðåêòèâ #include, íóæíî èçìåíÿòü ôàéëû
../aclocal.m4 è ../configure.in, ÷òîáû ðàáîòàë ñöåíàðèé configure */
#include <sys/types.h> /* áàçîâûå òèïû äàííûõ */
#include <sys/time.h> /* ñòðóêòóðà timeval{} äëÿ select() */
#include <time.h> /* timespec{} äëÿ pselect() */
#include <errno.h>
#include <fcntl.h> /* îòêëþ÷åíèå áëîêèðîâêè */
#include <limits.h> /* PIPE_BUF */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* êîíñòàíòû ðåæèìà äîñòóïà ê ôàéëó S_xxx */
#include <unistd.h>
#include <sys/wait.h>
#ifdef HAVE_MQUEUE_H
# include <mqueue.h> /* î÷åðåäè ñîîáùåíèé Posix */
#endif
#ifdef HAVE_SEMAPHORE_H
# include <semaphore.h> /* ñåìàôîðû Posix */
#ifndef SEM_FAILED
#define SEM_FAILED ((sem_t *)(- 1 ))
#endif
#endif
#ifdef HAVE_SYS_MMAN_H
# include <sys/mman.h> /* ðàçäåëÿåìàÿ ïàìÿòü Posix */
#endif
#ifndef MAP_FAILED
#define MAP_FAILED ((void *)(- 1 ))
#endif
#ifdef HAVE_SYS_IPC_H
# include <sys/ipc.h> /* System V IPC */
#endif
#ifdef HAVE_SYS_MSG_H
# include <sys/msg.h> /* î÷åðåäè ñîîáùåíèé System V */
#endif
#ifdef HAVE_SYS_SEM_H
#ifdef __bsdi__
#undef HAVE_SYS_SEM_H /* òîíêèé ìîìåíò: ïðîòîòèï semctl() â BSDI's ñîäåðæèò îøèáêè*/
#else
# include <sys/sem.h> /* ñåìàôîðû System V */
#endif
#ifndef HAVE_SEMUN_UNION
/* $$.It semun$$ */
union semun { /* îïðåäåëåíèå îáúåäèíåíèÿ äëÿ semctl() */
int val;
struct semid_ds *buf;
unsigned short *array;
};
#endif
#endif /* HAVE_SYS_SEM_H */
#ifdef HAVE_SYS_SHM_H
# include <sys/shm.h> /* ðàçäåëÿåìàÿ ïàìÿòü System V */
#endif
#ifdef HAVE_SYS_SELECT_H
# include <sys/select.h> /* äëÿ óäîáñòâà */
#endif
#ifdef HAVE_POLL_H
# include <poll.h> /* äëÿ óäîáñòâà */
#endif
#ifdef HAVE_STROPTS_H
# include <stropts.h> /* äëÿ óäîáñòâà */
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h> /* äëÿ óäîáñòâà */
#endif
/* Ñëåäóþùèå òðè çàãîëîâî÷íûõ ôàéëà íóæíû äëÿ ioctl ôàéëîâ è ñîêåòîâ:
* <sys/ioctl.h>, <sys/filio.h>, è <sys/sockio.h>.
*/
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_FILIO_H
# include <sys/filio.h>
#endif
#ifdef HAVE_PTHREAD_H
# include <pthread.h>
#endif
#ifdef HAVE_DOOR_H
# include <door.h> /* èíòåðôåéñ äâåðåé Solaris */
#endif
#ifdef HAVE_RPC_RPC_H
#ifdef _PSX4_NSPACE_H_TS /* áàãè Digital Unix 4.0b */
#undef SUCCESS
#endif
# include <rpc/rpc.h> /* Sun RPC */
#endif
/* Îïðåäåëÿåì bzero() êàê ìàêðîñ åñëè åãî íåò â ñòàíäàðòíîé áèáëèîòåêå Ñ */
#ifndef HAVE_BZERO
#define bzero(ptr,n) memset(ptr, 0 , n)
#endif
/* Posix.1g òðåáóåò, ÷òîáû INFTIM îïðåäåëÿëîñü â <poll.h>, íî âî ìíîãèõ ñèñòåìàõ ýòà êîíñòàíòà âñå åùå îïðåäåëÿåòñÿ â <sys/stropts.h>. Íàì íå íóæíî ïîäêëþ÷àòü âñå ôóíêöèè äëÿ ðàáîòû ñ ïîòîêàìè, ïîýòîìó ìû îïðåäåëÿåì INFTM çäåñü. Ýòî ñòàíäàðòíîå çíà÷åíèå, íî íåò ãàðàíòèé, ÷òî îíî ðàâíî -1 */
#ifndef INFTIM
#define INFTIM (- 1 ) /* íåîãðàíè÷åííîå âðåìÿ îïðîñà */
#ifdef HAVE_POLL_H
#define INFTIM_UNPH /* ÷òîáû èç ôàéëà unpxti.h óçíàòü, ÷òî êîíñòàíòà îïðåäåëåíà */
#endif
#endif
/* Ïðî÷èå êîíñòàíòû */
#ifndef PATH_MAX /* äîëæíà áûòü â <limits.h> */
#define PATH_MAX 1024 /* ìàêñèìàëüíîå êîëè÷åñòâî ñèìâîëîâ â ïîëíîì èìåíè ôàéëà */
#endif
#define MAX_PATH 1024
#define MAXLINE 4096 /* ìàêñèìàëüíàÿ äëèíà ñòðîêè */
#define BUFFSIZE 8192 /* îáúåì áóôåðà ÷òåíèÿ è çàïèñè */
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
/* ðàçðåøåíèÿ ïî óìîë÷àíèþ äëÿ íîâûõ ôàéëîâ */
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
/* ðàçðåøåíèÿ ïî óìîë÷àíèþ äëÿ íîâûõ êàòàëîãîâ */
#define SVMSG_MODE (MSG_R | MSG_W | MSG_R>> 3 | MSG_R>> 6 )
/* ðàçðåøåíèÿ ïî óìîë÷àíèþ äëÿ íîâûõ î÷åðåäåé ñîîáùåíèé System V */
#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>> 3 | SEM_R>> 6 )
/* ðàçðåøåíèÿ ïî óìîë÷àíèþ äëÿ íîâûõ ñåìàôîðîâ System V */
#define SVSHM_MODE (SHM_R | SHM_W | SHM_R>> 3 | SHM_R>> 6 )
/* ðàçðåøåíèÿ ïî óìîë÷àíèþ äëÿ íîâîé ðàçäåëÿåìîé ïàìÿòè System V */
typedef void Sigfunc(int); /* äëÿ îáðàáîò÷èêîâ ñèãíàëîâ */
#ifdef HAVE_SIGINFO_T_STRUCT
typedef void Sigfunc_rt(int, siginfo_t *, void *);
#endif
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))
#ifndef HAVE_TIMESPEC_STRUCT
struct timespec {
time_t tv_sec; /* ñåêóíäû */
long tv_nsec; /* è íàíîñåêóíäû */
};
#endif
/*
 ôóíêöèÿõ-îáåðòêàõ open(), mq_open(), sem_open() ìû îáðàáàòûâàåì äîïîëíèòåëüíûå àðãóìåíòû ñ ïîìîùüþ ìàêðîñîâ va_XXX(). Îäèí èç àðãóìåíòîâ èìååò òèï mode_t, ÷òî ïðèâîäèò ê îøèáêå â BSD/OS, ãäå äëÿ ýòîãî òèïà èñïîëüçóþòñÿ 16-ðàçðÿäíûå öåëûå. Ïðè âûçîâå îáåðòêè êîìïèëÿòîð ïðåîáðàçîâûâàåò 16-ðàçðÿäíîå öåëîå â 32-ðàçðÿäíîå. Ïîýòîìó è íåîáõîäèìî òî, ÷òî ñäåëàíî íèæå.
*/
#ifdef __bsdi__
#define va_mode_t int
#else
#define va_mode_t mode_t
#endif
/* ìàêðîñû áëîêèðîâêè çàïèñåé */
#define read_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
#define readw_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
#define write_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
#define writew_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
#define un_lock(fd, offset, whence, len) \
lock_reg(fd, F_SETLK, F_UNLCK, offset, whence, len)
#define is_read_lockable(fd, offset, whence, len) \
lock_test(fd, F_RDLCK, offset, whence, len)
#define is_write_lockable(fd, offset, whence, len) \
lock_test(fd, F_WRLCK, offset, whence, len)
В комментариях самого хидера написано, что этот хидер надо поместить в системную директорию lib. Я так и сделал, используя команду . Но вот откомпилировать всё равно не получается! Пишет, что No such file or directory. Как правильно использовать этот хидер?
|
|
|