共享内存的问题

时间:2011-05-27 11:20:27

标签: c gcc shared-memory

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

#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正在运行

2 个答案:

答案 0 :(得分:4)

默认情况下,

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

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

答案 1 :(得分:3)

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

您可以输入内容,因为终端没有阻止击键,即使您没有在任何地方暂停读取它。我经常输入“下一件事”,而我的命令行/终端正在忙着做其他事情,以便在完成后它就会接收。 stdin缓冲区仍然可以接受输入。它还没有使用它。