0

このプログラムを実行すると:

#include <sys/types.h>
#include <pthread.h>
#include <sys/mman.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>

int main () {

    int stat;

    pthread_mutex_t *mutex = (pthread_mutex_t*)mmap (0, sizeof (pthread_mutex_t) + sizeof (long),PROT_READ | PROT_WRITE,
                                                     MAP_SHARED ,-1, 0);

    long *data = (long*)(&mutex[1]); /* map 'data' after mutex */
    int pid;

    pthread_mutexattr_t attr;
    pthread_mutexattr_init (&attr);
    pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init (mutex, &attr);

    *data = 0;

    pid = fork ();

    pthread_mutex_lock (mutex);
    (*data)++;
    pthread_mutex_unlock (mutex);

    if (!pid) /* child exits */
        exit (0);
    else
        waitpid (pid, &stat, 0);
    printf ("data is %ld\n", *data);

    return 0;
}

私が持っていsegmentation faultます!問題は何ですか?そして、このエラーを解決するために何ができますか?

でデバグした後valgrind、私はこのメッセージを持っています:

==28660== Process terminating with default action of signal 11 (SIGSEGV)
==28660==  Access not within mapped region at address 0xF
==28660==    at 0x4E35C10: pthread_mutex_init (pthread_mutex_init.c:83)
==28660==    by 0x4008F0: main (in /home/program)
==28660==  If you believe this happened as a result of a stack
==28660==  overflow in your program's main thread (unlikely but
==28660==  possible), you can try to increase the size of the
==28660==  main thread stack using the --main-stacksize= flag.
==28660==  The main thread stack size used in this run was 8388608.
4

3 に答える 3

3

mmapファイル記述子なしで(ファイルまたはデバイスに支えられていない)呼び出しを行おうとしている場合は、MAP_ANONYMOUSフラグを設定する必要があります。がないMAP_ANONYMOUSと、EBADFエラーが発生します。

fdは有効なファイル記述子ではありません(MAP_ANONYMOUS設定されていません)。

MAP_SHARED | MAP_ANONYMOUSファイルまたはデバイスに支えられていない場合は、フラグとして使用してみてください。

すなわち:

pthread_mutex_t *mutex = (pthread_mutex_t*)mmap (0, sizeof (pthread_mutex_t) + sizeof (long),PROT_READ | PROT_WRITE,
                                                 MAP_SHARED | MAP_ANONYMOUS ,-1, 0);
于 2012-11-27T09:17:31.830 に答える
2

mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);fd-1で呼び出しています。私の知る限り、-1でmmapを呼び出すことは無効です。

mmapが成功したかどうかを確認if (mutex == MAP_FAILED)し、失敗した場合は、mmapがどのエラーを生成したかを確認します。errno

于 2012-11-27T09:12:09.363 に答える
1

プログラムをコンパイルして実行してみました。私も同じ問題、セグメンテーション違反に直面していました。

解決策:値が「-1」のfdを渡す場合は、たとえば(MAP_SHARED | MAP_ANON)のように「MAP_ANON」フラグを使用する習慣をつけてください。

これがあなたの問題を解決することを願っています:)

于 2012-11-27T11:31:04.400 に答える