当前位置: 首页 > 知识库问答 >
问题:

读写共享存储器

柏阳炎
2023-03-14

我有一个程序,其中我有一个父进程,我想创建3个子进程。

我还为每个共享内存创建了2个共享内存(IN、OUT)和1个信号量。

这个想法是:

父进程有3个整数,必须在共享内存中写入其中一个整数。然后其中一个子进程读取它,进行一些计算,并在共享内存(OUT)中写入一些内容,父进程从该内存读取结果。然后父进程将下一个整数添加到共享内存中,依此类推。

这是我的代码的一部分,我试图实现第一部分(从共享内存中写-读):

// create and attach shared memory

memidIN = shmget(...);
memidOUT= shmget(...);          
pointerIN = (...) shmat(...);       
pointerOUT = (...) shmat(...);      

// create and init semaphores

semIN = semget(...);
semOUT = semget(...);
semctl(semIN, ...);   // initialize both to 1
semctl(semOUT, ...);

for (i = 0; i < children; ++i) 
{
    pid = fork();

    if (pid) 
    {
        // parent process code

        down sem_IN
            write in shmIN
        up sem_IN

    } 
    else if (pid == 0) 
    {
        // Children processes code

        down sem_IN 
            read from shmIN
        up sem_IN

        exit(0);    

    } 
    else 
        //ERROR


}

    // dont die until childrens die
    for( j = 0; j < children; j++)
        wait(&status);

有什么想法吗?

共有1个答案

毕黎昕
2023-03-14

因此,您可以通过以下方式在共享内存中排列数据:

int Number;
bool Number_IsRead; // Initialized by 'true'.

当你需要传递一个数字时,你应该做

Number_IsRead = false;

子文件在读取number之前应检查Number_IsRead。当Number已读取时,child应将true分配给number_isread。

附言。通常,使用共享内存代替消息队列(msgget/msgctl/msgsnd/msgrcv/等)不是一个好主意。

 类似资料:
  • 问题内容: 我试图在共享内存上发布一些随机的东西;出于某些奇怪的原因,阅读器没有选择发件人写的东西 这是发件人: 这是读者: 如果重新启动阅读器,则阅读器确实能够读取发送方已写入的最后一个值。 但是,如果我先启动阅读器,然后再启动发送器,则阅读器不会拾取发送器写入的所有值。 为了使这个更奇怪,如果我在SHM :: read()中取消对printf语句的注释,那么读者有时可以使用。 任何的想法? G

  • 4.6.1.4 使用外部存储器(公共读写)文件 将文件存储在 SD 卡等外部存储器中时,就是这种情况。当存储比较庞大的信息(放置从 Web 下载的文件)或者将信息带出到外部时(备份等)时,应该使用它。 对于未指定的大量应用,“外部存储器文件(公共读写)”与“公共读写文件“有相同特性。另外,对于声明使用android.permission.WRITE_EXTERNAL_STORAGE权限的应用,它和

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关

  • 在我的应用程序中,视频是从外部存储器播放的,我保留了播放和共享的选项。通过点击共享按钮,用户可以共享视频,但存在一个问题,即视频无法共享。 这是我的文件路径。它是存在的。视频正在播放和删除,但未共享?? 这是为了共享文件(视频) 我如何分享我的视频?我应该实现什么来分享存储中的视频。你的回答对我来说很有价值

  • 问题内容: jenkins中的共享库文件在作业开始时加载,它存储在哪里?我正在尝试访问存储在共享库中的dockerfile,我需要在dockerbuild命令中提供的路径。有什么办法可以找出共享库文件在jenkins中的装载位置? 问题答案: 如果共享库是从SCM加载的,并且您的工作空间路径是,则将签出到或类似副本(如果该路径被另一个并发构建占用,则可能后缀数字)。 ,如果我理解正确,您是否不想在

  • 问题内容: 我正在评估Kubernetes作为我们新应用程序的平台。现在,一切看起来都非常令人兴奋!但是,我遇到了一个问题:我将群集托管在GCE上,并且需要某种机制在两个Pod之间共享存储(连续集成服务器和应用程序服务器)。用kubernetes做到这一点的最佳方法是什么?这些卷类型似乎都不符合我的需求,因为如果一个Pod需要写入GCE磁盘,则无法共享。NFS是完美的,但似乎需要为kubernet