2011-05-27 139 views
2

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

#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); 
    } 
} 
} 

如果我尝试执行代码,它打印开始和挂起,仅此而已发生,但一些为什么它接受输入从标准输入,所以我可以打印一样,如果scanf函数运行

回答

4

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

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

3

尝试在您的printf声明的结尾处添加新行(\n)全部。我认为在打印/冲洗缓冲区之前它失败了。

您可以输入内容,因为终端不会阻止按键操作,即使您没有在任何地方暂停阅读。我经常输入“接下来的事情”,而我的命令行/终端正在忙着做其他事情,以便它在完成时才会启动。 stdin缓冲区仍然可以接受输入。它只是不使用它。