cout<<"c_addr:"<<*p_addr<

sujw 2017-08-02 06:17:20
#include <stdio.h>
#include <iostream>
#include <vector>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define PERM S_IRUSR|S_IWUSR
using namespace std;
int main()
{
string sMatch;
key_t shmid;
int *p_addr, *c_addr;
if( (shmid = shmget(IPC_PRIVATE, 1024, PERM)) == -1 ) { //(1)申请一个共享内存
fprintf(stderr, "Create Share Memory Error:%s/n/a", strerror(errno));
exit(1);
}
p_addr = (int *)shmat(shmid, 0, 0);
*p_addr = 0;
pid_t pid;
vector<string> provList;
vector<string> fileList;
provList.push_back("100");
provList.push_back("200");
provList.push_back("300");
provList.push_back("400");
provList.push_back("500");
cout<<"main process,id="<<getpid()<<endl;
//循环处理"100,200,300,400,500"
for (vector<string>::iterator it = provList.begin(); it != provList.end(); ++it)
{
sMatch=*it;
pid = fork();
if(pid==0||pid==-1) //子进程退出循环,不再创建子进程,全部由主进程创建子进程,这里是关键所在
{
break;
}
}
if(pid==-1)
{
cout<<"fail to fork!"<<endl;
exit(1);
}
else if(pid==0)
{
//这里写子进程处理逻辑
cout<<"this is children process,id="<<getpid()<<",start to process "<<sMatch<<endl;
p_addr = (int *)shmat(shmid, 0, 0);
(*p_addr)++;
sleep(3);
exit(0);
}
else
{
//这里主进程处理逻辑
cout<<"this is main process,id="<<getpid()<<",end to process "<<endl;
sleep(3);
p_addr = (int *) shmat(shmid, 0, 0);
cout<<"c_addr:"<<*p_addr<<endl;
//解除共享内存映射
if((shmdt(p_addr)) < 0)
{
perror("shmdt");
exit(1);
}
exit(0);
}
return 0;
}
...全文
145 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Really_want 2017-08-03
  • 打赏
  • 举报
回复
万一shmat()函数返回的值是NULL呢,或者某个不可访问的地方,那不就CORE了?
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream! 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。
赵4老师 2017-08-03
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
#include #include using namespace std; class Teacher{ public: Teacher(string nam,int a,char s,string tit,string ad,string t):name(nam),age(a),sex(s),title(tit),addr(ad),tel(t){} void display(); protected: string name; int age; char sex; string title; string addr; string tel; }; void Teacher::display() { cout<<"name:"<endl; cout<<"age:"<endl; cout<<"sex:"<endl; cout<<"title:"<endl; cout<<"addr:"<<addr<<endl; cout<<"tel:"<endl; } class Cadre { public: Cadre(string nam,int a,char s,string p,string ad,string t):name(nam),age(a),sex(s),post(p),addr(ad),tel(t){} void display(); protected: string name; int age; char sex; string post; string addr; string tel; }; void Cadre::display() { cout<<"name:"<endl; cout<<"age:"<endl; cout<<"sex:"<endl; cout<<"post:"<endl; cout<<"addr:"<<addr<<endl; cout<<"tel:"<endl; } class Teacher_Cadre:public Teacher,public Cadre { private: int wages; public: Teacher_Cadre(string nam,int a,char s,string tit,string p,string ad,string t,int w): Teacher(nam,a,s,p,ad,t),Cadre(nam,a,s,p,ad,t),wages(w){} void show(); } ; void Teacher_Cadre::show() { Teacher::display(); cout<<"post:"<endl; cout<<"wages:"<endl; } int main() { Teacher_Cadre t1("zhang",20,'m',"tutor","普通职工","Build 305-503","6081202",1200); Teacher_Cadre t2("chen",38,'m',"associate professor","副院长","Build 3A-302","6088132",1300); Teacher_Cadre t3("fan",30,'f',"lectuer","教研室主任","Build 2A-202","6088099",1500); t1.show(); t2.show(); t3.show(); return 0; }
#pragma pack(4) //#include "stdafx.h" #pragma comment (lib,"Ws2_32.lib") #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include typedef struct iphdr { unsigned int headlen:4; unsigned int version:4; unsigned char tos; unsigned short totallen; unsigned short id; unsigned short falg; unsigned char ttl; unsigned char prot; unsigned short checksum; unsigned int sourceIP; unsigned int destIP; }IpHeader; typedef struct icmphdr { BYTE type; BYTE code; USHORT checksum; USHORT id; USHORT seg; }IcmpHeader; #define ICMP_RCHO 8 #define ICMP_RCHO_REPLY 0 #define ICMP_MIN 8 #define STATUS_FAILED 0xFFFF #define DEF_PACKET_SIZE 32 #define MAX_PACKET 1024 #define MAX_PING_PACKET_SIZE (MAX_PACKET+sizeof(IpHeader)) void fill_icmp_data(char *,int); USHORT checksum(USHORT *,int); void decode_resp(char *,int,struct sockaddr_in *); DWORD WINAPI FindIP(LPVOID pIPAddrTemp); WSADATA wsaData; SOCKET sockRaw; struct sockaddr_in dest,from,end; int fromlen =sizeof(from); char *recvbuf=new char[MAX_PING_PACKET_SIZE]; unsigned int addr=0; long ThreadNumCounter=0,ThreadNumLimit=20; long *aa=&ThreadNumCounter; void main(int argc,char *argv[]) { /*if(argc!=3) { cout<<"输入格式错误: start_ip end_ip"<<endl; return; }*/ if(WSAStartup(MAKEWORD(2,1),&wsaData)!=0) { cout<<"WASStartup failed"<endl; ExitProcess(STATUS_FAILED); } sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(sockRaw==INVALID_SOCKET) { cout<<"WASSocketet() falied"<endl; ExitProcess(STATUS_FAILED); } int timeout=1000; int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR) { cout<<"FAILED TO SEY RECV TIMEOUT"<endl; ExitProcess(STATUS_FAILED); } timeout=1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout)); if(bread==SOCKET_ERROR) { cout<<"FAILED TO SEY RECV TIMEOUT"<endl; ExitProcess(STATUS_FAILED); } memset(&dest,0,sizeof(dest)); unsigned long startIP,endIP; dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv[1]); startIP=inet_addr(argv[1]); end.sin_family=AF_INET; end.sin_addr.s_addr=inet_addr(argv[2]); endIP=inet_addr(argv[2]); HANDLE hThread; while(htonl(startIP)ThreadNumLimit) { Sleep(5000); continue; } DWORD ThreadID; sockaddr_in *pIPAddrTemp=new (sockaddr_in); if(!pIPAddrTemp) { cout<<"memory alloc failed"<<endl; return ; } *pIPAddrTemp=dest; clock_t start; start=clock(); hThread=CreateThread(NULL,NULL,FindIP,(LPVOID)pIPAddrTemp,NULL,&ThreadID); long i=60000000L; while(i--); TerminateThread(hThread,0); InterlockedDecrement(aa); memset(&from,0,sizeof(from)); startIP=htonl(htonl(startIP)+1); dest.sin_addr.s_addr=startIP; } while(ThreadNumCounter!=0) { Sleep(2000); return; cout<<"error"id=(USHORT)GetCurrentThreadId(); datapart=icmp_data+sizeof(IcmpHeader); memset(datapart,'A',datasize-sizeof(IcmpHeader)); } void decode_resp(char *buf,int bytes,struct sockaddr_in *from) { IpHeader *iphdr; IcmpHeader *icmphdr; unsigned short iphdrlen; iphdr=(IpHeader*) buf; iphdrlen=iphdr->headlen*4; icmphdr=(IcmpHeader *)(buf+iphdrlen); if(bytestype!=ICMP_RCHO_REPLY)return; if(icmphdr->id!=(USHORT)GetCurrentThreadId())return; cout<<"活动主机: "<<endl; cout<<" "addr)<1) { cksum+=*buffer++; size-=sizeof(USHORT); } if(size) { cksum+=*(UCHAR*)buffer; } cksum=(cksum>>16)+(cksum& 0xffff); cksum+=(cksum>>16); return (USHORT)(~cksum); } DWORD WINAPI FindIP(LPVOID pIPAddrTemp) { InterlockedIncrement(aa); char icmp_data[MAX_PACKET]; memset(icmp_data,0,MAX_PACKET); int datasize=DEF_PACKET_SIZE; datasize+=sizeof(IcmpHeader); fill_icmp_data(icmp_data,datasize); ((IcmpHeader*)icmp_data)->checksum=0; ((IcmpHeader*)icmp_data)->seg=0; ((IcmpHeader*)icmp_data)->checksum=checksum((USHORT*)icmp_data,datasize); int bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr *)pIPAddrTemp,sizeof(dest)); int n=0; if(bwrote==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { cout<<"timed out"<<endl; } cout<<"sendto failies"<endl; ExitProcess(STATUS_FAILED); n=1; } if(WSAGetLastError()==WSAETIMEDOUT) { cout<<"timed out"<<endl; ExitProcess(STATUS_FAILED); n=1; } if(bwrotecout<<"Worte"<endl; ExitProcess(STATUS_FAILED); n=1; } int bread=recvfrom(sockRaw,recvbuf,MAX_PING_PACKET_SIZE,0,(struct sockaddr *)&from,&fromlen); if(bread==SOCKET_ERROR) { if(WSAGetLastError()==WSAETIMEDOUT) { cout<<"timed out"<<endl; } cout<<"recvfrom falied"<endl; ExitProcess(STATUS_FAILED); n=1; } if(n==0) { decode_resp(recvbuf,bread,&from); InterlockedDecrement(aa); } return 0; }

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧