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;
}
...全文
139 3 打赏 收藏 转发到动态 举报
写回复
用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文件最大块大小”命令

64,637

社区成员

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

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