linux下C语言编程4使用共享内存实现进程间通信Word文档下载推荐.docx
- 文档编号:15090811
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:12
- 大小:19.51KB
linux下C语言编程4使用共享内存实现进程间通信Word文档下载推荐.docx
《linux下C语言编程4使用共享内存实现进程间通信Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《linux下C语言编程4使用共享内存实现进程间通信Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
进程A代码如下:
intmain()
{
intshmid;
shmid=shmget(IPC_PRIVATE,SIZE,IPC_CREAT|0600);
if(shmid<
0)
{
perror("
shmgeterror"
);
exit
(1);
}
printf("
createsharedmemoryOK.shmid=%d/n"
shmid);
return0;
}
进程B代码如下:
intmain(intargc,char*argv[])
{
intshmid;
char*shmaddr;
if(argc!
=2)
{
perror("
argcerror/n"
shmid=atoi(argv[1]);
shmaddr=(char*)shmat(shmid,NULL,0);
if((int)shmaddr==-1)
shmaterror./n"
}
strcpy(shmaddr,"
hello,world!
"
shmdt(shmaddr);
}
进程C代码如下:
char*shmaddr;
if(argc!
%s/n"
shmaddr);
进程D代码如下:
shmctl(shmid,IPC_RMID,NULL);
return0;
linux下C语言编程5-多线程编程
Linux系统下的多线程遵循POSIX线程接口,称为pthread。
编写Linux下的多线程程序,需要使用头文件pthread.h,编译需要在后面加-lpthread。
关于多线程,主要有以下几个过程:
1,创建线程
2,各个线程的执行
3,等待线程的结束
涉及的线程函数主要有:
1,intpthread_create(pthread_t*restricttidp,constpthread_attr_t*restrictattr,void*(*start_rtn)(void),
void*restrictarg);
函数有4个参数:
第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是一个函数指针(有关函数指针,看这里),指向线程运行函数的起始地址。
最后一个参数是函数指针所需要的参数。
注意:
pthread_create函数返回0表示成功。
另外如果函数指针需要多个参数的话,就将这些参数做成某个结构体,作为第4个参数。
如果有返回值的话,也可将返回值的指针回写到第4个参数中。
2,pthread_join()等待一个线程的结束。
pthread_exit()用于线程退出,可以指定返回值,以便其他线程通过pthread_join()函数获取该线程的返回值。
线程的应用:
并行数据库的查询
假设我们有3台计算机A,B,C,每台均安装PG数据库,通过网络连接。
我们可以通过多线程将查询SQL广播出去,A,B,C并行查询,最终返回各自的结果。
如果没有多线程,而只是用了个循环,那么我们获取结果的过程将是顺序的,即等A的结果返回后才能查询B,B结束后查询C,效率低下。
代码如下:
//最多支持MAX个线程#defineMAX16
/****多线程******/
typedefstructPDthread
char*host;
//IP
intport;
//端口
char*dbname;
//数据库名
char*query;
//SQL语句
void*rst;
//查询结果
}PDthread;
typedefstructNodes
intcount;
//实际上的节点数量count<
=MAX
charhost[MAX][32];
intport[MAX];
}Nodes;
/*线程的执行过程,参数m为PDthread结构*/
void*PDthreadSelect(void*m)
PDthread*p=(PDthread*)m;
p->
rst=(void*)ExecuteQuery(p->
host,p->
port,p->
dbname,p->
query);
pthread_exit(NULL);
returnNULL;
}/*创建多个线程,1个node对应1个线程*输出:
thread[],pdthread*输入:
node,dbname,query,这些值写到pdthread变量中,传递给函数PDthreadSelect(因为此函数只能有一个参数)*/
voidPDthreadCreate(pthread_tthread[],PDthread*pdthread,Nodes*node,char*dbname,char*query)
inttmp;
inti;
PDthread*p;
for(i=0;
i<
node->
count;
i++)
//把Nodes作为PDthread的一部分
p=pdthread+i;
host=node->
host[i];
port=node->
port[i];
dbname=dbname;
query=query;
tmp=pthread_create(&
thread[i],NULL,PDthreadSelect,p);
if(tmp!
=0)printf("
PDthreadCreate:
线程%d创建失败!
/n"
i);
elseprintf("
线程%d被创建/n"
voidPDthreadWait(pthread_tthread[],intcount)
//等待线程结束
inti;
for(i=0;
i++)
{
if(thread[i]!
=0)
{
pthread_join(thread[i],NULL);
printf("
线程%d已经结束/n"
}
}
Nodesnode;
node.count=3;
strcpy(node.host[0],"
192.168.0.1"
node.port[0]=5432;
strcpy(node.host[1],"
192.168.0.2"
node.port[1]=5432;
strcpy(node.host[2],"
192.168.0.3"
node.port[2]=5432;
//使用多线程去获取数据
pthread_tthread[MAX];
memset(&
thread,0,sizeof(thread));
//获取结果
PDthread*pdthread=(PDthread*)malloc(node.count*sizeof(PDthread));
PDthreadCreate(thread,pdthread,&
node,"
database"
"
SELECT*FROMstudent"
PDthreadWait(thread,node.count);
//返回结果存储在pdthread->
rst
编译命令:
gcc-I/usr/local/pgsql/include-othth.c-L/usr/local/pgsql/lib-lpq-lpthread,因为使用了libpq库。
Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现(Linux环境下C编程指南)
Linux环境下C编程指南,通过共享内存进行进程间通信的例子,进程间同步使用信号量来实现。
使用说明:
这是一个简单的服务器和客户端程序,如果启动程序时不带参数,则执行服务器程序;
如果带参数,则执行客户端程序,所带参数只有一个,就是服务器端所显示的共享内存的引用ID。
实现原理:
服务器端启动后,创建信号量和共享内存,并将共享内存的引用ID显示出来,将信号量
的引用ID存放在共享内存中。
客户端启动后,利用服务器端提供的内存共享ID将共享内存附加到地址段,读取信号量以实现两个进程之间的同步。
之后,这两个进程就可以利用共享内存进行进程间通信,客户端输入的信息将在服务器端显示出来。
#include<
stdlib.h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 语言 编程 使用 共享 内存 实现 进程 通信