سلوك Sem_getvalue غريب/غير صحيح للإشارة على نظام التشغيل OS X

StackOverflow https://stackoverflow.com/questions/871435

سؤال

لدي بعض أكواد الإشارة الأساسية جدًا التي تعمل بشكل رائع على نظام التشغيل Linux، لكن لا يمكنني تشغيلها بشكل صحيح على نظام التشغيل OS X طوال حياتي...ويعود بأغرب النتائج..

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);

    int value;
    sem_getvalue(test, &value);
    printf("Semaphore initialized to %d\n", value);
}

يؤدي تجميع هذا على OS X باستخدام g++ إلى إرجاع المخرجات التالية:

iQudsi:Desktop mqudsi$ g++ test.cpp
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to -1881139893

بينما في Ubuntu، أحصل على النتيجة الأكثر عقلانية بالتأكيد:

iQudsi: Desktop mqudsi$ g++ test.cpp -lrt
iQudsi:Desktop mqudsi$ ./a.out 
Semaphore initialized to 1

لقد كنت في هذا لمدة 3 ساعات متواصلة، ولا أستطيع معرفة سبب قيام OS X بإرجاع مثل هذه النتائج الغريبة ...

لقد حاولت استخدام مسارات الملفات كاسم إشارة، ولم يحدث ذلك فرقًا.

سأقدر أي مساعدة يمكنني الحصول عليها.

هل كانت مفيدة؟

المحلول

$ g++ sem-testing.cc -Wall
$ ./a.out 
sem_getvalue: Function not implemented
$ man sem_getvalue
No manual entry for sem_getvalue

أنت تستخدم وظيفة غير مطبقة حاليًا في نظام التشغيل Mac OS X، والعدد الصحيح الذي تطبعه يحتوي على البيانات الافتراضية التي تمت تهيئة العدد الصحيح بها والتي ربما كانت بيانات عشوائية كانت لا تزال في الذاكرة.لو قمت بإخراجها من خلال ضبطها int value = 0; ربما تكون قد اكتشفت هذا الخطأ عاجلاً.

هذا هو الرمز الذي استخدمته (بفضل bdonlan):

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}

نصائح أخرى

هل اختبار للأخطاء؟ جرب:

#include <iostream>
#include <fcntl.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
    sem_t* test;
    test = sem_open("test", O_CREAT, 0, 1);
    if (test == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    int value;
    if (sem_getvalue(test, &value)) {
        perror("sem_getvalue");
        return 1;
    }
    printf("Semaphore initialized to %d\n", value);
}

حسنا، ربما sem_open () فشل - أنت لم اختبار.

وأو ربما OSX لا الافتراضي إلى دعم SEMS POSIX المشتركة - إذا لم يتم تحميل / ديف / SHM، وعادة النظام لا يدعم sem_open ()

وأنت قد تحتاج إلى استخدام الإشارات SysV.

وكان طرح سؤال مماثل بشأن سلاكوير هنا: كيف do- ط-توقف semopen-عدم-مع-enosys

ولكن، يظهر مزيد من البحث OSX اسمه مبنية semaphones على رأس الإشارات ماخ، وربما كنت بحاجة إلى sem_unlink () لهم عند الانتهاء من ذلك (وليس فقط sem_close ()، أو ربما بدلا من ذلك)، ويجب أن نكون حذرين حول أذونات - أقترح بدءا من 0777 أو ربما 0700، بدلا من 0. انظر <لأ href = "http://forums.macnn.com/79/developer-center/237556/posix-semaphores-in-darwin/" يختلط = "نوفولو noreferrer"> الإشارات posiz في داروين

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top