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缓冲区仍然可以接受输入。它只是还没用