1、linux 下 C 语言编程 4-使用共享内存实现进程间通信共享内存的函数有以下几个:(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数 shmid 所指向的共享内存与当前进程连接。当使用某共享内存时,需要先使用 shmat,达成连接。(3)int shmdt(const void *shmaddr),将先前用 shmat 连接的共享内存与当前进程解除连接。参数 shmaddr 为 shmat 返回的共
2、享内存的地址。在完成对共享内存的使用后,需要使用 shmdt 解除连接。(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的操作。当cmd 为 IPC_RMID 时,删除 shmid 所指的共享内存。这些函数的表头文件为和,其详细参数请去网上搜索。下面给出一个使用共享内存实现进程间通信的例子:进程 A 开辟一块新的共享内存,进程B 修改这个共享内存,进程 C 打印输出这个共享内存的内容,进程 D 删除这个共享内存。进程 BCD 运行的命令格式为:命令 共享内存 ID,如./output 123432。进程 A 代码如下:in
3、t main() int shmid; shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600); if (shmid rst = (void *)ExecuteQuery(p-host, p-port, p-dbname, p-query);pthread_exit(NULL); return NULL; /* 创建多个线程,1 个 node 对应 1 个线程 * 输出:thread, pdthread * 输入:node, dbname, query, 这些值写到 pdthread 变量中,传递给函数 PDthreadSelect(因为此函数只
4、能有一个参数) */void PDthreadCreate(pthread_t thread, PDthread *pdthread, Nodes *node, char *dbname, char *query) int tmp;int i;PDthread *p; for (i=0; icount; i+) / 把 Nodes 作为 PDthread 的一部分 p = pdthread + i; p-host = node-hosti;p-port = node-porti;p-dbname = dbname; p-query = query;tmp = pthread_create( i
5、f (tmp != 0) printf(“PDthreadCreate: 线程%d 创建失败!/n“, i); else printf(“PDthreadCreate: 线程%d 被创建/n“, i); void PDthreadWait(pthread_t thread, int count) / 等待线程结束 int i; for (i=0; irst return 0; 编译命令:gcc -I/usr/local/pgsql/include -o th th.c -L/usr/local/pgsql/lib -lpq -lpthread,因为使用了 libpq 库。Linux 下通过共享
6、内存进行进程间通信,进程间同步使用信号量来实现(Linux 环境下 C编程指南) Linux 环境下 C 编程指南,通过共享内存进行进程间通信的例子,进程间同步使用信号量来实现。使用说明:这是一个简单的服务器和客户端程序,如果启动程序时不带参数,则执行服务器程序;如果带参数,则执行客户端程序,所带参数只有一个,就是服务器端所显示的共享内存的引用 ID。实现原理:服务器端启动后,创建信号量和共享内存,并将共享内存的引用 ID 显示出来,将信号量的引用 ID 存放在共享内存中。客户端启动后,利用服务器端提供的内存共享 ID 将共享内存附加到地址段,读取信号量以实现两个进程之间的同步。之后,这两个进
7、程就可以利用共享内存进行进程间通信,客户端输入的信息将在服务器端显示出来。#include #include #include #include #include #include #include #include #include #define SHMDATASIZE 1000#define BUFFERSIZE (SHMDATASIZE - sizeof(int)#define SN_EMPTY 0#define SN_FULL 1int deleteSemid=0;union semunint val; struct semid_ds *buf; unsigned short int
8、 *array; struct seminfo *_buf; ;void server(void); /不加参数时执行void client(int shmid);void delete(void);void sigdelete(int signum);void locksem(int semid, int semnum);void unlocksem(int semid, int semnum);void waitzero(int semid, int semnum);void clientwrite(int shmid, int semid, char *buffer);int safes
9、emget(key_t key, int nsems, int semflg);int safesemctl(int semid, int semnum, int cmd, union semun arg);int safesemop(int semid, struct sembuf *sops, unsigned nsops);int safeshmget(key_t key, int size, int shmflg);void *safeshmat(int shmid, const void *shmaddr, int shmflg);int safeshmctl(int shmid,
10、int cmd, struct shmid_ds *buf);int main(int argc, char *argv)if ( argc int atexit( void (*func)(void) ); 功能: 当程序终止执行时,函数调用函数指针 func 所指向的函数。可以执行多重调用(至少 32 个),这些函数以其注册的倒序执行。执行成功返回零值,失败则返回非零值 PET/CT 示踪剂18F-FDG(氟代脱氧葡萄糖)氟代脱氧葡萄糖氟代脱氧葡萄糖是 2-脱氧葡萄糖的氟代衍生物。其完整的化学名称为 2-氟-2-脱氧-D-葡萄糖,通常简称为 18F-FDG 或 FDG。FDG 最常用于正电
11、子发射断层扫描( PET)类的医学成像设备:FDG 分子之中的氟选用的是属于正电子发射型放射性同位素的氟-18(fluorine-18,F-18,18F,18 氟),从而成为 18F-FDG(氟-18F脱氧葡糖)。在向病人(患者,病患)体内注射 FDG 之后,PET 扫描仪可以构建出反映 FDG 体内分布情况的图像。接着,核医学医师或放射医师对这些图像加以评估,从而作出关于各种医学健康状况的诊断。历史二十世纪 70 年代,美国布鲁克海文国家实验室(Brookhaven National Laboratory)的 Tatsuo Ido 首先完成了 18F-FDG 的合成。1976 年 8 月,宾
12、夕法尼亚大学的 Abass Alavi 首次将这种化合物施用于两名正常的人类志愿者。其采用普通核素扫描仪(非 PET 扫描仪)所获得的脑部图像,表明了 FDG 在脑部的浓聚(参见下文所示的历史参考文献)。作用机理与代谢命运作为一种葡萄糖类似物,FDG 将为葡萄糖高利用率细胞(high-glucose-using cells)所摄取,如脑、肾脏以及癌细胞。在此类细胞内,磷酸化过程将会阻止葡萄糖以原有的完整形式从细胞之中释放出来。葡萄糖之中的 2 位氧乃是后续糖酵解所必需的;因而,FDG 与 2-脱氧-D-葡萄糖相同,在细胞内无法继续代谢;这样,在放射性衰变之前,所形成的 FDG-6-磷酸将不会发
13、生糖酵解。结果,18F-FDG 的分布情况就会很好地反映体内细胞对葡萄糖的摄取和磷酸化的分布情况。在 FDG 发生衰变之前, FDG 的代谢分解或利用会因为其分子之中 2位上的氟而受到抑制。不过,FDG 发生放射性衰变之后,其中的氟将转变为 18O;而且,在从环境当中获取一个 H+之后,FDG 的衰变产物就变成了葡萄糖-6-磷酸,而其 2位上的标记则变为无害的非放射性“重氧”(heavy oxygen,oxygen-18);这样,该衰变产物通常就可以按照普通葡萄糖的方式进行代谢。 临床应用在 PET 成像方面, 18F-FDG 可用于评估心脏、肺脏以及脑部的葡萄糖代谢状况。同时,18F-FDG
14、 还在肿瘤学方面用于肿瘤成像。在被细胞摄取之后, 18F-FDG 将由己糖激酶(在快速生长型恶性肿瘤之中,线粒体型己糖激酶显著升高)),加以磷酸化,并为代谢活跃的组织所滞留,如大多数类型的恶性肿瘤。因此,FDG-PET 可用于癌症的诊断、分期(staging)和治疗监测(treatment monitoring),尤其是对于霍奇金氏病(Hodgkins disease,淋巴肉芽肿病,何杰金病)、非霍奇金氏淋巴瘤(non-Hodgkins lymphoma,非何杰金氏淋巴瘤)、结直肠癌( colorectal cancer)、乳腺癌、黑色素瘤以及肺癌。另外,FDG-PET 还已经用于阿耳茨海默氏
15、病( Alzheimers disease,早老性痴呆)的诊断。在旨在查找肿瘤或转移性疾病(metastatic disease)的体部扫描应用当中,通常是将一剂 FDG 溶液(通常为 5 至 10 毫居里,或者说 200 至 400 兆贝克勒尔)迅速注射到正在向病人静脉之中滴注生理盐水的管路当中。此前,病人已经持续禁食至少 6 小时,且血糖水平适当较低(对于某些糖尿病病人来说,这是个问题;当血糖水平高于 180 mg/dL = 10 mmol/L 时,PET 扫描中心通常不会为病人施用该放射性药物;对于此类病人,必须重新安排 PET 检查)。在给予 FDG 之后,病人必须等候大约 1 个小时
16、,以便FDG 在体内充分分布,为那些利用葡萄糖的器官和组织所摄取;在此期间,病人必须尽可能减少身体活动,以便尽量减少肌肉对于这种放射性葡萄糖的摄取(当我们所感兴趣的器官位于身体内部之时,这种摄取会造成不必要的伪影(artifacts,人工假象)。接着,就会将病人置于 PET 扫描仪当中,进行一系列的扫描(一次或多次);这些扫描可能要花费 20 分钟直至 1 个小时的时间(每次 PET 检查,往往只会对大约体长的四分之一进行成像)。生产与配送手段医用回旋加速器(medical cyclotron)之中用于产生 18F 的高能粒子轰击条件(bombardment conditions)会破坏像脱氧
17、葡萄糖(deoxyglucose,脱氧葡糖)或葡萄糖之类的有机物分子,因此必须首先在回旋加速器之中制备出氟化物形式的放射性18F。这可以通过采用氘核(deuterons,重氢核)轰击氖-20 来完成;但在通常情况下,18F 的制备是这样完成的:采用质子轰击富 18O 水(18O-enriched water,重氧水),导致 18O 之中发生 (p,n)核反应(中子脱出,或者说散裂( spallation),从而产生出具有放射性核素标记的氢氟酸(hydrofluoric acid,HF )形式的 18F。接着,将这种不断快速衰变的 18F -(18-氟化物,18-fluoride)收集起来,并立
18、即在“热室(hot cell)(放射性同位素化学制备室)”之中,借助于一系列自动的化学反应(亲核取代反应或亲电取代反应),将其连接到脱氧葡萄糖之上。之后,采取尽可能最快的方式,将经过放射性核素标记的 FDG 化合物(18F 的衰变限定其半衰期仅为 109.8 分钟)迅速运送到使用地点。为了将 PET 扫描检查项目的地区覆盖范围拓展到那些距离生产这种放射性同位素标记化合物的回旋加速器数百公里之遥的医学分子影像中心,其中可能还会使用飞机空运服务。最近,用于制备 FDG,备有自屏蔽( integral shielding,一体化屏蔽,一体化防护)以及便携式化学工作站(portable chemistry stations)的现场式回旋加速器(on-site cyclotrons),已经伴随 PET 扫描仪落户到了偏远医院。这种技术在未来具有一定的前景,有望避免因为要将 FDG 从生产地点运送到使用地点而造成的忙乱。