尝试创建共享内存块,但我得到的是奇怪的行为。
#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正在运行一样
发布于 2011-05-27 19:32:08
默认情况下,stdout是行缓冲的,这意味着在打印换行符之前不会刷新它。这意味着您需要将\n放在"got mid"、"got maddr"和"messager 1"字符串的末尾,或者将fflush();放在这些printf()之后。
顺便说一下,SYSV共享内存已经过时了。POSIX机制的设计要好得多-请参阅shm_open()和相关调用。
发布于 2011-05-27 19:32:14
尝试在所有printf语句的末尾添加一个新行(\n)。我假设它在打印/刷新缓冲区之前失败了。
您可以输入内容,因为终端不会阻止击键,即使您没有在任何地方暂停阅读它。当我的命令行/终端忙于做其他事情时,我会定期输入“下一件事”,这样它就会在完成时恢复。标准输入缓冲区仍然可以接受输入。它只是还没有使用它。
https://stackoverflow.com/questions/6151511
复制相似问题