C 共享内存的问题
试图创建共享内存块,我得到的是奇怪的行为C 共享内存的问题,c,gcc,shared-memory,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
#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);
}
}
}
#包括
#包括“stdio.h”
#包括
int main(){
printf(“启动\n”);
int mid=-1;
mid=shmget((键)1234、4096、IPC|u CREAT | 0666);
如果(mid==-1){
printf(“无法获取中间\n”);
返回1;
}否则{
printf(“got mid”);
}
int*maddr=0;
maddr=shmat(中间,空,0);
如果(maddr==(int*)-1){
printf(“无法附加内存”);
返回1;
}否则{
printf(“变得疯狂”);
}
而(1){
int-cval=\uuuuuu-sync\u-add\u和\u-fetch(maddr,1);
如果(cval%2){//奇数值
printf(“信使1”);
睡眠(1000);
}
}
}
如果我尝试执行该代码,它将开始打印并挂起,不会发生更多的事情,但它接受stdin输入的原因有一些,所以我可以打印,就像scanf正在运行一样,默认情况下,stdout
是行缓冲的,这意味着它在打印换行之前不会刷新。这意味着您需要将\n
放在“got mid”
、“got maddr”
和“messager 1”
字符串或fflush()的末尾代码>在那些printf()
s之后
顺便说一下,SYSV共享内存已经过时了。POSIX机制的设计明显更好-请参见shm_open()
和相关调用。尝试在所有printf
语句的末尾添加一行新的(\n
)。我假设它在打印/刷新缓冲区之前失败
您可以输入内容,因为终端不会阻止击键,即使您没有在任何地方暂停阅读。当我的命令行/终端忙于做其他事情时,我经常输入“下一件事”,以便在完成后它会自动启动。stdin缓冲区仍然可以接受输入。它只是还没用