当前位置: 技术问答>linux和unix
linux c编程 程序异常退出 使用的是共享内存········
来源: 互联网 发布时间:2016-09-03
本文导语: 代码: /* 以下使用共享内存进行进程之间的通信 */ #include #include #include #include #include #define SHMSIZE 4096 int main() { int shm_id; key_t key; pid_t pid; void *shm_addr; char *shm_stuff; pi...
代码:
/*
以下使用共享内存进行进程之间的通信
*/
#include
#include
#include
#include
#include
#define SHMSIZE 4096
int main()
{
int shm_id;
key_t key;
pid_t pid;
void *shm_addr;
char *shm_stuff;
pid=fork();
if (pid0) //父进程
{
wait(); //等待子进程结束
key = ftok(".",0);
if (key==-1)
{
perror("ftok error");
return 1;
}
shm_id=shmget(key,SHMSIZE,IPC_CREAT|0777); //申请4K的共享内存
if (shm_id==-1)
{
perror("shmget error");
return 1;
}
//得到地址
shm_addr=shmat(shm_id,(void*)(0),0);
if (shm_addr==(void*)(-1))
{
perror("shmat");
return 1;
}
printf("这是父进程,共享内存的地址是%Xn",(int)(shm_addr));
shm_stuff=(char*)shm_addr;
printf("我是父亲,我听到孩子说:%s",shm_stuff);
}
if (pid==0) //子进程
{
key = ftok(".",0);
if (key==-1)
{
perror("ftok error");
return 1;
}
shm_id=shmget(key,SHMSIZE,IPC_CREAT|0777); //申请4K的共享内存
if (shm_id==-1)
{
perror("shmget error");
return 1;
}
//得到地址
shm_addr=shmat(shm_id,(void*)(0),0);
if (shm_addr==(void*)(-1))
{
perror("shmat");
return 1;
}
printf("这是子进程,共享内存的地址是%Xn",(int)(shm_addr));
shm_stuff=(char*)shm_addr;
shm_stuff="我是孩子进程,这就是我想对父亲说的话n";
_exit(1);
}
return 1;
}
程序运行结果:
[root@localhost test4]# ./4-3
这是子进程,共享内存的地址是B7F06000
这是父进程,共享内存的地址是B7F06000
我是父亲,我听到孩子说:[root@localhost test4]#
程序应该是异常退出了·····
可是为什么呢??????
/*
以下使用共享内存进行进程之间的通信
*/
#include
#include
#include
#include
#include
#define SHMSIZE 4096
int main()
{
int shm_id;
key_t key;
pid_t pid;
void *shm_addr;
char *shm_stuff;
pid=fork();
if (pid0) //父进程
{
wait(); //等待子进程结束
key = ftok(".",0);
if (key==-1)
{
perror("ftok error");
return 1;
}
shm_id=shmget(key,SHMSIZE,IPC_CREAT|0777); //申请4K的共享内存
if (shm_id==-1)
{
perror("shmget error");
return 1;
}
//得到地址
shm_addr=shmat(shm_id,(void*)(0),0);
if (shm_addr==(void*)(-1))
{
perror("shmat");
return 1;
}
printf("这是父进程,共享内存的地址是%Xn",(int)(shm_addr));
shm_stuff=(char*)shm_addr;
printf("我是父亲,我听到孩子说:%s",shm_stuff);
}
if (pid==0) //子进程
{
key = ftok(".",0);
if (key==-1)
{
perror("ftok error");
return 1;
}
shm_id=shmget(key,SHMSIZE,IPC_CREAT|0777); //申请4K的共享内存
if (shm_id==-1)
{
perror("shmget error");
return 1;
}
//得到地址
shm_addr=shmat(shm_id,(void*)(0),0);
if (shm_addr==(void*)(-1))
{
perror("shmat");
return 1;
}
printf("这是子进程,共享内存的地址是%Xn",(int)(shm_addr));
shm_stuff=(char*)shm_addr;
shm_stuff="我是孩子进程,这就是我想对父亲说的话n";
_exit(1);
}
return 1;
}
程序运行结果:
[root@localhost test4]# ./4-3
这是子进程,共享内存的地址是B7F06000
这是父进程,共享内存的地址是B7F06000
我是父亲,我听到孩子说:[root@localhost test4]#
程序应该是异常退出了·····
可是为什么呢??????
|
你这句话是将指针shm_stuff指向了"我是孩子进程,这就是我想对父亲说的话n"的首地址。
而不是将"我是孩子进程,这就是我想对父亲说的话n"拷贝进shm_addr所指的共享内存块。
你可以用memcpy拷贝一下。
另外父子两个进程存在竞争关系,就是父子进程的执行顺序是不定的。很可能你的字符串还没有拷贝过去,
父进程已经在打印了,所以父进程最好休眠一段时间,等待一下子进程
而不是将"我是孩子进程,这就是我想对父亲说的话n"拷贝进shm_addr所指的共享内存块。
你可以用memcpy拷贝一下。
char str[] = "我是孩子进程,这就是我想对父亲说的话n";/*放在程序开始处*/
memcpy(shm_addr,str,sizeof(str));/*替代你的那句代码*/
另外父子两个进程存在竞争关系,就是父子进程的执行顺序是不定的。很可能你的字符串还没有拷贝过去,
父进程已经在打印了,所以父进程最好休眠一段时间,等待一下子进程
|
shm_stuff="我是孩子进程,这就是我想对父亲说的话n";
这是在全局空间申请不可写内存,存放 "我是孩子进程,这就是我想对父亲说的话n";
然后将申请得到的内存地址赋值于shm_stuff。
shm_stuff是两进程共享内存的地址,所以你需要申请字符串数组,存放 "我是孩子进程,这就是我想对父亲说的话n";
然后将字符串数组拷贝到共享内存中.