【问题标题】:Shared segment memory writing random numbers共享段内存写入随机数
【发布时间】:2014-09-04 16:02:56
【问题描述】:

我的 C 程序存在逻辑问题。我正在尝试创建一个写入内存缓冲区(如 10 个随机数)和文本文件中的进程。正如您将在我的代码中看到的那样,我已经有了它,但我似乎无法理解如何使用共享内存来执行此操作。

我试图理解我必须先定义一个缓冲区大小并将 id 存储到一个项目中,然后我必须将我的随机数存储在该项目数组中。我想错了吗? 我的逻辑是否遗漏了什么?

这是我目前所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
int main()
{

    int i, n;
    time_t t;

     n = 10;

    srand((unsigned) time(&t));

    FILE *fp;
    fp = fopen ("letter.txt","a+");
    if (fp == NULL) {
        printf ("File not created okay, errno = %d\n", errno);
        return 1;
    }
    for( i = 0 ; i < n ; i++ ) {
        fprintf(fp,"%d\n", rand() % 10);


        /* here is where I would store the random numbers in the buffer */
    }

    fclose (fp);
    printf ("File created okay\n");
    scanf();
    return(0);
}

【问题讨论】:

  • 您使用的是哪个平台?哪个函数需要管理该平台上的共享内存段? (例如,在 POSIX 系统上至少有两组共享内存调用,加上mmap()。)您实际尝试过什么?专业提示:在您可以将确定性数据写入共享内存之后添加随机化。当数据是随机的时,很难发现你所做的是否正确。您打算如何检查已写入共享内存的内容?提示:共享内存通常涉及多个进程共享对单个内存块的访问。
  • 请注意,带有零参数的scanf() 调用是一场等待发生的灾难。您至少需要格式字符串参数。
  • 哦,我明白了,让我改变我的 scanf 然后我使用 windows,但我也在我的计算机中使用 debian vm,并使用 putty 和 nano 在 debian 中写入......所以有一大块两个或多个进程使用的内存我必须指向相同的内存地址吗?

标签: c memory process buffer shared


【解决方案1】:

您可以在 VM 内的多个进程中使用共享内存,但您将无法在 VM 中运行的进程和在主机 O/S、Windows 中运行的进程之间共享内存。如果虚拟机运行的是 Debian,那么您需要使用以下之一:

  1. mmap()
  2. shmget(), shmctl(), shmat(), shmdt() — 'System V IPC' 共享内存调用。
  3. shm_open(), shm_unlink() — 更新的、更类似于 POSIX 的共享内存调用。

您可能需要两个连接到同一个共享内存段的程序。他们很可能会将段映射到相同的地址。如果您将指针存储在共享内存中,那么将它们映射到同一地址至关重要。如果您存储相对于共享内存段的基地址的偏移量,那么它们是否映射到相同的地址并不重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2013-11-18
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多