尝试创建共享内存块,我得到的是奇怪的行为。
#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正在运行
答案 0 :(得分:4)
stdout
是行缓冲的,这意味着在打印换行符之前不会刷新它。这意味着您需要将\n
放在"got mid"
,"got maddr"
和"messager 1"
字符串的末尾,或fflush();
之后的printf()
顺便说一下,SYSV共享内存已经过时了。 POSIX机制设计得更好 - 请参阅shm_open()
和相关调用。
答案 1 :(得分:3)
尝试在\n
语句的所有末尾添加新行(printf
)。我认为在打印/刷新缓冲区之前它会失败。
您可以输入内容,因为终端没有阻止击键,即使您没有在任何地方暂停读取它。我经常输入“下一件事”,而我的命令行/终端正在忙着做其他事情,以便在完成后它就会接收。 stdin缓冲区仍然可以接受输入。它还没有使用它。