2014-09-04 92 views
0

我遇到了一個與我的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); 
} 
+0

您正在使用哪個平臺?哪個函數需要在該平臺上管理共享內存段? (至少有兩組共享內存調用,加上'mmap()',例如在POSIX系統上可用)。你真正嘗試過什麼?專業提示:在將確定性數據寫入共享內存之後添加隨機數。當數據是隨機的時候,很難判斷你所做的是否正確。你打算如何檢查你寫入共享內存的內容?提示:共享內存通常涉及多個進程共享對單個內存塊的訪問。 – 2014-09-04 16:33:50

+0

請注意,帶有零參數的'scanf()'調用是等待發生的災難。您至少需要格式字符串參數。 – 2014-09-04 16:40:50

+0

oh我seee,讓我改變我的scanf然後即時通訊使用Windows,而且即時通訊使用我的電腦內的debian虛擬機,並使用膩子和納米寫在debian內...所以有一個由兩個或更多的過程我使用的內存塊必須指向相同的內存地址? – AbdulHamid 2014-09-04 17:30:52

回答

0

您可以使用多個進程中共享內存的虛擬機中,但是你不能夠在虛擬機中運行的進程之間共享內存和處理運行主機O/S,Windows。如果VM正在運行Debian,則需要使用以下其中一種:

  1. mmap()
  2. shmget()shmctl()shmat()shmdt() —'系統V IPC的共享存儲器調用。
  3. shm_open(), shm_unlink() —更近期的,更像POSIX的共享內存調用。

您可能需要兩個連接到相同共享內存段的程序。他們很可能會將該段映射到相同的地址。如果將指針存儲在共享內存中,則至關重要的一點是它們映射到相同的地址。如果存儲相對於共享內存段的基址的偏移量,那麼它們映射到相同的地址並不重要。