当前位置:  技术问答>linux和unix

如何使用共享内存让两个子进程写入同一个链表?

    来源: 互联网  发布时间:2016-02-02

    本文导语:  我现在有一个程序,需要再两个不同的子进程之间分别写入链表,但第一个子进程写入信息后,第二个就把它覆盖了,不知道大侠有没有什么好的解决方法?本来我打算使用子进程间发送消息,把上一个进程的指针存...

我现在有一个程序,需要再两个不同的子进程之间分别写入链表,但第一个子进程写入信息后,第二个就把它覆盖了,不知道大侠有没有什么好的解决方法?本来我打算使用子进程间发送消息,把上一个进程的指针存在消息里,但又不知道如何把字符串类型的地址转化为指针,如果大侠知道,请告知。谢谢。我写的代码如下:

//gcc -o mmapmytest mmapmytest.c -lrt
#include 
#include 
#include 
#include 
#include 
#include 
#include    
#include  
#include 
#include 
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

struct userlist
{
char name[20];
struct userlist *next;
};

int main(int argc, char *argv[])
{
int i, n, nloop;
struct userlist *head;
struct userlist *list;

pid_t pid;
nloop = 10;
list = mmap(NULL, sizeof(struct userlist), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
head = list;

//第一个子进程赋值0-9
if((pid = fork())==0)
{
for(i = 0; i name, 20, "%d", i);
list->next= NULL;
list->name[n] = '';
list->next = list+1;
list++;

}
exit(0);
}
waitpid(pid, NULL, 0);
//等待第一个子进程完毕后再赋值10-19
if((pid = fork())==0)
{
for(i = 10; i name, 20, "%d", i);
list->next= NULL;
list->name[n] = '';
list->next = list+1;
list++;
}
exit(0);
}
waitpid(pid, NULL, 0);
struct userlist *cur;
cur = head;
i = 0;
while(cur->next)
{
printf("name=%s, addr=%p, next=%pn", cur->name, cur->name, cur->next);
cur = cur->next;
}

printf("赋值完成n");
exit(0);
}


但运行的结果如下:
[root@WEB190 c]# gcc -o mmapmytest mmapmytest.c -lrt
[root@WEB190 c]# ./mmapmytest  
name=10, addr=0x40017000, next=0x40017018
name=11, addr=0x40017018, next=0x40017030
name=12, addr=0x40017030, next=0x40017048
name=13, addr=0x40017048, next=0x40017060
name=14, addr=0x40017060, next=0x40017078
name=15, addr=0x40017078, next=0x40017090
name=16, addr=0x40017090, next=0x400170a8
name=17, addr=0x400170a8, next=0x400170c0
name=18, addr=0x400170c0, next=0x400170d8
name=19, addr=0x400170d8, next=0x400170f0
赋值完成

|
fork之前把list保存在head中即可,还有
list = mmap(NULL, sizeof(struct userlist), ...
分配的内存不够
========
//gcc -o mmapmytest mmapmytest.c -lrt
#include 
#include 
#include 
#include 
#include 
#include 
#include    
#include  
#include 
#include 
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)

struct userlist
{
        char name[20];
        struct userlist *next;
};

int main(int argc, char *argv[])
{
        int i, n, nloop;
        struct userlist *head;
        struct userlist *list;

        pid_t pid;
        nloop = 10;
        list = mmap(NULL, 21 * sizeof(struct userlist), PROT_READ|PROT_WRITE,
                       MAP_SHARED|MAP_ANON, -1, 0);
        head = list;

        //第一个子进程赋值0-9
        if((pid = fork())==0)
        {
                for(i = 0; i name, 20, "%d", i);
                        list->name[n] = '';
                        list->next = list+1;
                        list++;
                }
                list->next = NULL;
                exit(0);
        }
        waitpid(pid, NULL, 0);
        //等待第一个子进程完毕后再赋值10-19
        list = head;
        while (list->next)
                list++;
        if((pid = fork())==0)
        {
                for(i = 10; i name, 20, "%d", i);
                        list->name[n] = '';
                        list->next = list+1;
                        list++;
                }
                list->next = NULL;
                exit(0);
        }
        waitpid(pid, NULL, 0);
        struct userlist *cur;
        cur = head;
        i = 0;
        while(cur->next)
        {
                printf("name=%s, addr=%p, next=%pn",
                               cur->name, cur, cur->next);
                cur = cur->next;
        }

        printf("赋值完成n");
        exit(0);
}

    
 
 

您可能感兴趣的文章:

  • 怎么使用jdbc往db2中写入BLOB?
  • 使用php测试硬盘写入速度示例
  • mtd写入数据使用write函数有时会出错,困扰n天了
  • java使用randomaccessfile在文件任意位置写入数据
  • 我要向一个文本写入my name is ="cyg",使用sed "27i my name is="cyg"" aaa > bbb 出现错误,但我必须在cyg上加双引号,该如何做。
  • 能否使用shell统计已存在文件的行数并写入当前文件
  • 使用mksysb命令备份系统到磁带上,提示有文件没有写入,该怎么解决
  • jquery.cookie() 方法的使用(读取、写入、删除)
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • 使用ps命令,如何使用系统命令根据进程名称获取进程和子进程的ID?除了ps,还有其它系统命令的办法吗?谢谢。
  • 怎么打开一个进程并得到这个进程内存使用的信息?
  • fork一个子进程后在打开一个文件,如何在子进程中使用这个打开的文件描述符号
  • linux进程(线程)运行过程中如何获取本进程当前的内存使用状况,统计信息?
  • 如何实现这样的API,可同时被不同的进程/线程使用,但是又不区分进程/线程?
  • 如何查看某个进程的cpu使用和内存使用情况????
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • 如何使用另外进程的socket
  • [急]linux对于c 如何获得一个进程及其子进程从开始到结束 它的最大CPU% MEM%使用率
  • 子进程用_exit退出,父进程为什么就不能让stdout使用缓存呢?
  • AIX系统中不使用lsof,还有没有其他命令可以知道端口是被那个进程使用
  • 进程间通信:pthread_cond使用在线程间,我要进程间条件同步(没有情缘关系的进程),采用什么方呢?也就是说我要在UNIX实现WIN32上命名Event的功能
  • 请问在 linux 下如何使用 execl() 调用另一个多进程的程序?
  • 计算进程的内存使用量应该使用/proc/self/statm哪几个量相加表示?
  • 怎么查一个特定进程使用的端口号啊
  • 大家好,我想问下有人用过"linux进程的内存使用解析"中推荐使用的"Ben Maurer写的perl脚本"查看内存么
  • 有人研究 或者 使用 实时进程 吗?请进来好吗?
  • 进程对串口读写时使用互斥机制吗?
  • 请问在UNIX上如何看一个进程的内存使用情况?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况
  • linux下free命令显示的内存使用情况分析
  • 共享内存一般是怎么使用的,是同消息队列配合使用么
  • solaris 8 下有没有返回系统总物理内存和当前所使用内存大小的函数。(不是top,vmstat命令)
  • 使用VWMARE安装linux的内存使用问题
  • 我的redhat linux7.3因为内存有些少,所以我想随时查看内存的使用情况该如何去做,还有我想关掉(而不是切换)图形界面应该用什么命令
  • 100分求解如何查看内存最高使用值!!
  • 内核不能使用虚拟内存?
  • 如何减少内存的使用。
  • 怎样才能配置XSERVER,让它能最少的使用资源??哪一个窗口管理器使用资源最少??为什么我的LINUX用掉了我80%的内存资源??????要我命呀!!!!!
  • Unix/linux下如何监测共享内存的使用情况
  • 请问在SOLARIS上怎么实时查看程序的内存使用状况??
  • top命令显示的内存使用量是如何得出的
  • linux如何限制指定进程的内存使用量?
  • linux下共享内存 函数shmat()的使用!
  • 关于进程内存使用问题
  • 如何高效使用内存?
  • Linux 下监控某进程 内存使用峰值的方法?
  • AIX 4.3.X中用什么命令能查看到系统内存的使用情况?
  • linux内存使用了100%,为什么
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3