首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享内存问题

共享内存问题
EN

Stack Overflow用户
提问于 2011-05-27 19:20:27
回答 2查看 184关注 0票数 2

尝试创建共享内存块,但我得到的是奇怪的行为。

代码语言:javascript
复制
#include <sys/shm.h>
#include "stdio.h"
#include <sys/ipc.h>

int main() {
printf("starting\n");

int mid = -1;
mid = shmget((key_t)1234, 4096, IPC_CREAT|0666);
if(mid == -1) {
    printf("cant get mid\n");
    return 1;
} else {
    printf("got mid");
}

int* maddr = 0;
maddr = shmat(mid, NULL ,0);
if(maddr == (int*)-1) {
    printf("cant attach memory\n");
    return 1;
} else {
    printf("got maddr");
}

while(1) {
    int cval = __sync_add_and_fetch(maddr, 1);
    if(cval % 2) { // odd values
            printf("messager 1");
            sleep(1000);
    }
}
}

如果我尝试执行该代码,它会打印开始并挂起,没有其他事情发生,但它接受来自stdin输入的一些原因,所以我可以打印,就像scanf正在运行一样

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-27 19:32:08

默认情况下,stdout是行缓冲的,这意味着在打印换行符之前不会刷新它。这意味着您需要将\n放在"got mid""got maddr""messager 1"字符串的末尾,或者将fflush();放在这些printf()之后。

顺便说一下,SYSV共享内存已经过时了。POSIX机制的设计要好得多-请参阅shm_open()和相关调用。

票数 4
EN

Stack Overflow用户

发布于 2011-05-27 19:32:14

尝试在所有printf语句的末尾添加一个新行(\n)。我假设它在打印/刷新缓冲区之前失败了。

您可以输入内容,因为终端不会阻止击键,即使您没有在任何地方暂停阅读它。当我的命令行/终端忙于做其他事情时,我会定期输入“下一件事”,这样它就会在完成时恢复。标准输入缓冲区仍然可以接受输入。它只是还没有使用它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6151511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档