LINUX下系统编程,多进程间数据共享,即共享变量
#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<stdio.h>#include<sys...
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<signal.h>
int flag_oo=99;
void init()
{
flag_oo=111;
int a=0;
for(a=0;a<5;a++)
{
printf("task is diong ...\n");
sleep(1);
}
printf("***********%d\n",flag_oo);
execl("/bin/ls","ls",NULL);
}
int main()
{
int a;int i;
pid_t pid;
pid=fork();
if (pid == 0) /* 子进程执行此命令 */
{
init();
}
else if(pid > 0)
{
wait(&a);
printf("//////////////////%d\n",flag_oo);
return 0;
}
}
以上程序运行时,子进程与父进程的flag_oo不同,我知道这是因为子进程只是父进程的副本,但应该怎样修改使两次结果相同??
要用到共享内存吧,应该怎么用?是shmget shmat等函数吗?
另外,我要共享的是一个结构体,跟一个int型变量有什么不同?
请诸位帮帮忙,最好有源代码 展开
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<signal.h>
int flag_oo=99;
void init()
{
flag_oo=111;
int a=0;
for(a=0;a<5;a++)
{
printf("task is diong ...\n");
sleep(1);
}
printf("***********%d\n",flag_oo);
execl("/bin/ls","ls",NULL);
}
int main()
{
int a;int i;
pid_t pid;
pid=fork();
if (pid == 0) /* 子进程执行此命令 */
{
init();
}
else if(pid > 0)
{
wait(&a);
printf("//////////////////%d\n",flag_oo);
return 0;
}
}
以上程序运行时,子进程与父进程的flag_oo不同,我知道这是因为子进程只是父进程的副本,但应该怎样修改使两次结果相同??
要用到共享内存吧,应该怎么用?是shmget shmat等函数吗?
另外,我要共享的是一个结构体,跟一个int型变量有什么不同?
请诸位帮帮忙,最好有源代码 展开
4个回答
展开全部
共享内存相关的API怎么使用不难:
1. 首先调用shmget分配一个新的共享内存,这里你可以指定其大小,如果你要分配一个整形,那你可以将size参数设置成4,如果你要共享一个结构体那就将size参数设置成你的结构体大小,操作系统不关心你要共享什么,它只关心你要分配多少个字节的区间。而且实际上操作系统会将你要求的大小按照内存页面的大小进行对齐,也就是说它可能实际上给你分配若干个页面的物理存储空间,只要这个空间能够容纳你所指定的大小就ok了。它的第三个参数是关于一些访问权限设置的,要讲起来太长,建议自己搜索一下,或者用man查查帮助。总之,调用完shmget以后系统会给你创建一段共享内存,然后返回给你一个shmid,也就是这个共享内存的标识,你可以理解为给它取了个名字。
2. 接着调用shmat将这段共享内存映射到你的进程的虚拟地址空间上。这个函数的第一个参数就是你之前调用shmget创建的共享内存的名字shmid;第二个参数是个指针,指向你的进程虚存空间中的某个地址,你可以通过传入一个确定的地址强行要求操作系统将共享内存映射到你指定的虚存地址上(可能会失败,如果你指定的虚拟地址空间已经映射了别的物理存储空间),也可以通过传入0地址让系统给你选择一个合适的地址(它会通过返回值把地址返回给你)。第三个参数则允许你指定一些特殊的标志位,还是那句话,太复杂自己搜索一下看看,一般应用不需要用到。
至于例子嘛你可以看看下面这个链接:
http://baike.baidu.com/view/3025906.htm
另外,你要知道只用共享内存是不互斥的,你必须结合信号量一起使用才能防止互斥问题的出现。如果你共享的只是一个整形变量可能问题不大,因为对页面对齐的整形变量的读写都是原子操作,但如果你共享的是个复杂的结构体就得小心了。
1. 首先调用shmget分配一个新的共享内存,这里你可以指定其大小,如果你要分配一个整形,那你可以将size参数设置成4,如果你要共享一个结构体那就将size参数设置成你的结构体大小,操作系统不关心你要共享什么,它只关心你要分配多少个字节的区间。而且实际上操作系统会将你要求的大小按照内存页面的大小进行对齐,也就是说它可能实际上给你分配若干个页面的物理存储空间,只要这个空间能够容纳你所指定的大小就ok了。它的第三个参数是关于一些访问权限设置的,要讲起来太长,建议自己搜索一下,或者用man查查帮助。总之,调用完shmget以后系统会给你创建一段共享内存,然后返回给你一个shmid,也就是这个共享内存的标识,你可以理解为给它取了个名字。
2. 接着调用shmat将这段共享内存映射到你的进程的虚拟地址空间上。这个函数的第一个参数就是你之前调用shmget创建的共享内存的名字shmid;第二个参数是个指针,指向你的进程虚存空间中的某个地址,你可以通过传入一个确定的地址强行要求操作系统将共享内存映射到你指定的虚存地址上(可能会失败,如果你指定的虚拟地址空间已经映射了别的物理存储空间),也可以通过传入0地址让系统给你选择一个合适的地址(它会通过返回值把地址返回给你)。第三个参数则允许你指定一些特殊的标志位,还是那句话,太复杂自己搜索一下看看,一般应用不需要用到。
至于例子嘛你可以看看下面这个链接:
http://baike.baidu.com/view/3025906.htm
另外,你要知道只用共享内存是不互斥的,你必须结合信号量一起使用才能防止互斥问题的出现。如果你共享的只是一个整形变量可能问题不大,因为对页面对齐的整形变量的读写都是原子操作,但如果你共享的是个复杂的结构体就得小心了。
展开全部
简单的实现,没有添加同步机制,回头再添加上去,而且,我是在不同终端里面写的,你可以把两段代码,一个放到父进程,一个放到子进程...就可以了
你说的这些API,自己man 一次,看看说明就知道用法了....
楼上说的对齐的问题,我没有太注意..不过,不管你要共享什么,一个sizeof看看大小,一个memcpy拷贝,你就作为数据直接拷贝到共享内存区域就OK了...另外一边再拷贝回来,用一个结构体类型的指针指向你拷贝回来的数据,不就给这部分内存再规划成一个结构体了。。
至于具体的, KEY 的含义,你需要了解linux的ipc机制。
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#define BUF_SIZE 100
#define KEY 99
int main(void)
{
int shmid;
char *shmptr;
shmid=shmget(99,BUF_SIZE,IPC_CREAT|0666);
if(shmid==-1)
{
printf("Shared Memory Created error...\n");exit(0);
}
shmptr=shmat(shmid,NULL,0);
if(shmptr==(void*)-1)
{
printf("shmat error,shmptr= %d \n",shmptr);
exit(1);
}
while(1)
{
printf("type strings into Shared Memory:");
fgets(shmptr,BUF_SIZE,stdin);
}
return 0;
}
下面这段就每隔10秒钟扫描共享内存区域的内容:
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#define BUF_SIZE 100
#define KEY 99
int main(void)
{
int shmid;
char *shmptr;
shmid=shmget(99,BUF_SIZE,IPC_CREAT|0666);
if(shmid==-1)
{
printf("Shared Memory Created error...\n");exit(0);
}
shmptr=shmat(shmid,NULL,0);
if(shmptr==(void*)-1)
{
printf("shmat error,shmptr= %d \n",shmptr);
exit(1);
}
while(1)
{
printf("Infomation in Shared Memory:");
printf("%s \n",shmptr);
sleep(10);
}
return 0;
}
你说的这些API,自己man 一次,看看说明就知道用法了....
楼上说的对齐的问题,我没有太注意..不过,不管你要共享什么,一个sizeof看看大小,一个memcpy拷贝,你就作为数据直接拷贝到共享内存区域就OK了...另外一边再拷贝回来,用一个结构体类型的指针指向你拷贝回来的数据,不就给这部分内存再规划成一个结构体了。。
至于具体的, KEY 的含义,你需要了解linux的ipc机制。
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#define BUF_SIZE 100
#define KEY 99
int main(void)
{
int shmid;
char *shmptr;
shmid=shmget(99,BUF_SIZE,IPC_CREAT|0666);
if(shmid==-1)
{
printf("Shared Memory Created error...\n");exit(0);
}
shmptr=shmat(shmid,NULL,0);
if(shmptr==(void*)-1)
{
printf("shmat error,shmptr= %d \n",shmptr);
exit(1);
}
while(1)
{
printf("type strings into Shared Memory:");
fgets(shmptr,BUF_SIZE,stdin);
}
return 0;
}
下面这段就每隔10秒钟扫描共享内存区域的内容:
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<sys/shm.h>
#define BUF_SIZE 100
#define KEY 99
int main(void)
{
int shmid;
char *shmptr;
shmid=shmget(99,BUF_SIZE,IPC_CREAT|0666);
if(shmid==-1)
{
printf("Shared Memory Created error...\n");exit(0);
}
shmptr=shmat(shmid,NULL,0);
if(shmptr==(void*)-1)
{
printf("shmat error,shmptr= %d \n",shmptr);
exit(1);
}
while(1)
{
printf("Infomation in Shared Memory:");
printf("%s \n",shmptr);
sleep(10);
}
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
There are programming details at this site:
Unix多进程编程和进程间的通讯
有详细的源程序,我就不一一复制。
linux 可以照猫画虎。
Unix多进程编程和进程间的通讯
有详细的源程序,我就不一一复制。
linux 可以照猫画虎。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
帮你顶,希望有这方面专业知道的朋友能站出来帮助你解决困难.
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询