проблема с общей памятью - PullRequest
2 голосов
/ 27 мая 2011

Пытался создать блок общей памяти, и я получил странное поведение.

#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 работал

Ответы [ 2 ]

4 голосов
/ 27 мая 2011

stdout по умолчанию буферизуется, что означает, что он не сбрасывается до тех пор, пока не будет напечатана новая строка. Это означает, что вам нужно поставить \n в конце строк "got mid", "got maddr" и "messager 1" или fflush(); после этих printf() s.

Кстати, общая память SYSV устарела. Механизмы POSIX значительно лучше разработаны - см. shm_open() и связанные вызовы.

3 голосов
/ 27 мая 2011

Попробуйте добавить новую строку (\n) в конце всех ваших printf операторов. Я предполагаю, что перед печатью / очисткой буфера происходит сбой.

Вы можете вводить данные, потому что терминал не блокирует нажатия клавиш, даже если вы нигде не останавливались, чтобы прочитать его. Я регулярно печатаю «следующую вещь», пока моя командная строка / терминал занята чем-то другим, чтобы он просто начинал, когда все готово. Буфер stdin все еще может принимать ввод. Он просто еще не использует его.

...