A. 如何用C语言实现采用共享内存的进程间通信
共享内存的函数有以下几个:
(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返回的共享内存的地址。
在完成对共享内存的使用后,需要使用shmdt解除连接。
(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的操作。当cmd为IPC_RMID时,删除shmid所指的共享内存。
这些函数的表头文件为<sys/ipc.h>和<sys/shm.h>
下面给出一个使用共享内存实现进程间通信的例子:进程A开辟一块新的共享内存,进程B修改这个共享内存,进程C打印输出这个共享内存的内容,进程D删除这个共享内存。
进程BCD运行的命令格式为:命令 共享内存ID,如./output 123432。
进程A代码如下:
int main()
{
int shmid;
shmid = shmget(IPC_PRIVATE, SIZE, IPC_CREAT | 0600);
if (shmid <亏银缓 0)
{
perror("shmget error");
exit(1);
}
printf("create shared memory OK. shmid=%d/n", shmid);
return 0;
}
进程B代码如下:
int main(int argc, char *argv[])
{
int shmid;
char *shmaddr;
if (argc != 2)
{
perror("argc error/n");
exit(1);
}
shmid = atoi(argv[1]);
shmaddr = (char *)shmat(shmid, NULL, 0);
if ((int )shmaddr == -1)
{
perror("shmat error./n");
exit(1);
}
strcpy(shmaddr, "hello, world!");
shmdt(shmaddr);
return 0;
}
进程C代码如下:
int main(int argc, char *argv[])
{
int shmid;
char *shmaddr;
if (argc != 2)
{
printf("argc error/n");
exit(1);
}
shmid = atoi(argv[1]);
shmaddr = (char *)shmat(shmid, NULL, 0);
if ((int )shmaddr == -1)
{
perror("shmat error./n"搏蚂);
exit(1);
}
printf("%s/n", shmaddr);
shmdt(shmaddr);
return 0;
}
进程D代码如下:
int main(int argc, char *argv[])
{
int shmid;
if (argc != 2)
{
perror("argc error/n");
exit(1);
}
shmid = atoi(argv[1]);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
B. C语言 数组共享式
有一个已排好序(从大到小)的数组有5个元素,从键盘输巧虚入一个数,要求按原排序的规律将它插入到数组中
#include
void main()
{
int i,x,j;
int a[6]={1,5,10,15,20};
scanf("%d",&x);
for(i=0;i<5;i++)
if(x<a[i])
{
j=i; /*当这个数比当前数兄宽漏小时,用j记住当前位置,即j=i,中断循环。比当前数大时继续下一个(小应当在左侧,大则在右侧) */
break;
}
for(i=5;i>=j;i--)
a[i+1]=a[i]; /*将位置j以后的数据都向后移一位*/
a[i+1]=x; /* 把要羡烂插入的数x放到a[i]中,因为i--后 i 比实际要插入的位置少1,所以真正插入的位置应该i+1*/
for(i=0;i<=5;i++) /*这时一共有6个数*/
{
printf("%d ",a[i]);
}
}
C. C++中如何实现一个类的所有对象之间的数据共享
声明顷乱哪成静态变量就可以:
如陪碰 class a{
static int a;//共享雀码变量
}
D. 如何用标准C语言创建出共享内存
分类: 电脑/网络 >> 程序设计 >> 其他编程语高孝言
问题描述:
第一次接触这个,手边又没相关资料.有没有热心的高手给详细的源码? 感竖并激不尽!
解析:
CPEHelper::CPEHelper(PCSTR lpFileName)
{
hFile = INVALID_HANDLE_VALUE;
hFile = CreateFileA( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
}
CPEHelper::CPEHelper(PCWSTR lpFileName)
{
hFile = INVALID_HANDLE_VALUE;
hFile = CreateFileW( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
}
bool CPEHelper::operator !()
{
if (hFile == INVALID_HANDLE_VALUE)
return true;
return false;
}
CPEHelper::~CPEHelper(void)
{
if(hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
}
bool CPEHelper::MappingFile()
{
hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0,NULL);
if (hMapFile == NULL)
return false;
lpMapAddress = MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
if (lpMapAddress == NULL)
return false;
return true;
}
void CPEHelper::UnMappingFile()
{
UnmapViewOfFile(lpMapAddress);
CloseHandle(hMapFile);
}
这是余念迹我的一个程序中的一段
希望对你有帮助
E. 如何在进程中定义全局共享数据(C语言实现)
各个厂家的C++语言有自已的一套进程全局共享变量的方法,不通用,如
VC++与C++BUILDER就不一样的,网上可以搜到文章,是其正的全局变袭孝量共享。
WINDOWS API 提供了一种通拍亮稿用的全局变量共享办法,键念就是利用变量与文件
的映射技术实现的,可以搜到 FileMapping技术实现的共享变量的例子
F. 如何实现数据共享
这是一个很宽泛的问题。
1、简单的电脑、终端、移动平台的共享 ,可以通过各类系统服务来实现 ,比如FTP、SAMBA服务器、TFTP、系统 自带的共享服务 比如微软的默认共享功能。
2、如果是OA相关的共享 ,可以参考如下塌兄几点:
1OA大平台集合了HR、CRM、OA三套系统还可以跟据你的业务需求扩展多套小系统,让你的OA随着企业的发展一同发展,哪衫世同时具有深度的数据交换,实现数据共享,达到真正的协同管理。
2OA平台的高扩展性和高可变性让使用者无需IT功底,稍加培训,就能成为本企业的个性化系统的“开发者”,这样就能很好的满企业的个性化需求以及不断变化的需求,很好的提升了OA办公系统的生命力,让你的OA长久不衰。
3为方便用户,提升用户打造个性化管理系统的效率,借鉴成熟的管理模式,OA平台上还提供了三套大而全的主流管理软件OA、HR、CRM,让企业能更好的构建一体化管理体系!
4OA不是一个简单的李肢无纸化的软件,而是一个管理工具,通过它来贯彻企业管理制度的执行,传播企业文化,通过流程的规范、知识的沉淀、员工的配合和协作来促进企业中人与组织的和谐发展。
求采纳,有问题可以继续问
G. 如何用C语言实现向某个IP发送数据包(例如4个浮点数)
使用socket编程即可。
1、网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
2、下面用Socket实现一个windows下的c语言socket通信例子,这里客户端传递一个字符串,服务器端进行接收。
【服务器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //侦听套接字,连接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用于遍历信息的指针
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//创建Socket,使用TCP协议
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
WSACleanup();
printf("socket() faild!\n");
return;
}
//构建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
//绑定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("bind() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}
//侦听连接请求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
return;
}
printf("Waiting for client connecting!\n");
printf("Tips: Ctrl+c to quit!\n");
//阻塞等待接受客户端连接
while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
{
length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
if (sServer == INVALID_SOCKET)
{
printf("accept() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //关闭套接字
WSACleanup();
return;
}
char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)&receiveMessage;
while(nLeft>0)
{
//接收数据
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{
printf("recv() failed!\n");
return;
}
if (ret == 0) //客户端已经关闭连接
{
printf("Client has closed the connection\n");
break;
}
nLeft -= ret;
ptr += ret;
}
printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。
}
// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}
【客户端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //侦听端口
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //连接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//确认WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
return;
}
//创建Socket,使用TCP协议
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
return;
}
//构建服务器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
//连接服务器
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient); //关闭套接字
WSACleanup();
return;
}
char sendMessage[]="hello this is client message!";
ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
closesocket(sClient); //关闭套接字
WSACleanup();
}
H. C语言高手来,共享内存的方法
共享内存竖和用于进程之间通信,如果是多线程,用全局变量+信号量互斥就可以了呀?
非要用的话,一个进程用shmget创建共享内存区,然后用shmat连接共享内存进行访问
注意要好郑配合信号量互斥,共享内存本身是没有同步机制的友纤颂。
I. C语言 建立共享内存
#include <stdio.h>
#include <malloc.h>
#include <string.h>
char *memory, *currentPointer;
void ShareMemory( char function, char *a )
{
switch (function)
{
case 'c':
memory = ( char * )malloc( 65 * sizeof( char ) );
memory[64] = 0;
currentPointer = memory;
break;
case 'r':
printf("%s", memory);
printf("\n");
break;
case 'w':
strcpy( currentPointer, a );
while( *currentPointer != '\0' )
{
currentPointer++;
}
break;
case 'd':
free(memory);
break;
default:
printf("wrong parameter!"李数穗);
}
}
int main()
{
char *a = "aaaaa";
ShareMemory('c', a);
ShareMemory('r', a);
ShareMemory('w', a);
a = "bbbbb";
ShareMemory('w', a);
ShareMemory('r', a);
ShareMemory('d'哪卜毕宏, a);
return 0;
}
J. c语言实现wifi共享就向360免费wifi那种
这个,win 7以上windows系统的话,可以用system函数调用以下命令。(偷懒的做法)
设置wlan热点:
netshwlansethostednetorkmode=allowssid=hotkey=12345
hot处填热点名称,12345除填密码。
开启热点:
netshwlanstarthostednetwork
关闭热点:
netshwlanstophostednetwork
其他的功能你可以网络。
c语言中,可以从键盘读取ssid和密码,然后构造字符串
netshwlansethostednetorkmode=allowssid=hotkey=12345
然后作为参数调用system()函数来实现。