2

セマフォを使用して、プロセス間の通信を含むいくつかのコードを処理しています。私はこのような構造を作りました:

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

そのように使用します(メインアプリと下位プロセスで同じ)

container *memory;

shm_unlink("MYSHM"); //just in case
fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

if(fd == -1) {
    printf("Error");
    exit(EXIT_FAILURE);
}
memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
ftruncate(fd, sizeof(container));

sem_関数の1つを使用するとすべて問題ありませんが、次のようなことをしようとすると

memory->counter = 5;

動作しません。おそらくポインタに何か問題がありましたが、ほとんどすべてを試しましたが、何も機能していないようです。プロセス間で変数や構造などを共有するためのより良い方法があるのではないでしょうか。残念ながら、ブーストなどを使用することは許可されていません。コードは教育目的であり、可能な限りシンプルに保つことを目的としています。

4

2 に答える 2

6

shm_unlink()直前に使用しているためshm_open()、2つのプロセスが同じ共有メモリオブジェクトを開くことはありません。それぞれが新しい別個のオブジェクトを作成しています(同じ名前であっても)。


「機能しない」とはどういう意味かは明確ではありません。次の最小限の例は、あなたのコードに基づいており、私にとってはうまく機能します。それはあなたのために何をしますか?

#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>

typedef struct container {
    sem_t resource, mutex;
    int counter;
} container;

int main()
{
    container *memory;
    int fd = shm_open("MYSHM", O_RDWR|O_CREAT|O_EXCL, 0);

    if(fd == -1) {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, sizeof(container));
    memory = mmap(NULL, sizeof(container), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    memory->counter = 5;
    printf("%d\n", memory->counter);

    return 0;
}

コードを確認すると、の後exec()に子プロセスでファイル記述子にアクセスしようとしているため失敗し、デフォルトshm_openでフラグが設定FD_CLOEXECされているため、子でファイル記述子が開かれなくなります。したがって、メインプロセスでそのフラグの設定を解除する必要があります(たとえば、後のエラーをチェックした直後shm_open)。

fdflags = fcntl(fd, F_GETFD);
fdflags &= ~FD_CLOEXEC;
fcntl(fd, F_SETFD, fdflags);
于 2010-05-19T00:38:42.077 に答える
-1

なぜshm_openを呼び出しているのですか?これを行うためのかなり良い方法は、パス名で「open」を呼び出してそれを使用することです。

于 2010-05-19T16:54:44.590 に答える