1

これは、私が与えられた中で最も困難な課題の 1 つです。共有メモリを使用して名前付きパイプ (mkfifo 機能など) を実装する必要があります。

少し時間がかかりましたが、最終的に の実装に成功しましたun-named pipe。次に、上記の Named を完了する必要があります。

私の理解では、Named pipe用途mkfifo、つまり、ディスク上にファイルを作成し、プロセスAは名前付きパイプから読み取ることができ、読み取り中に、他のすべてのプロセスがそのファイル(別名名前付きパイプ)に書き込むことをブロックします....修正してください私が間違っていたら私に!!?

さて、私の質問は、共有メモリを使用して名前付きパイプを実装するにはどうすればよいかということです。

I open a shared memory segment を使用un-named pipeすると、次のようになります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024  /* make it a 1K shared memory segment */

int main(int argc, char *argv[])
{
    key_t key;
    int shmid;
    char *data;
    int mode;

    if (argc > 2) {
        fprintf(stderr, "usage: shmdemo [data_to_write]\n");
        exit(1);
    }

    /* make the key: */
    if ((key = ftok("shmdemo.c", 'R')) == -1) {
        perror("ftok");
        exit(1);
    }

    /* connect to (and possibly create) the segment: */
    if ((shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT)) == -1) {
        perror("shmget");
        exit(1);
    }

    /* attach to the segment to get a pointer to it: */
    data = shmat(shmid, (void *)0, 0);
    if (data == (char *)(-1)) {
        perror("shmat");
        exit(1);
    }

    /* read or modify the segment, based on the command line: */
    if (argc == 2) {
        printf("writing to segment: \"%s\"\n", argv[1]);
        strncpy(data, argv[1], SHM_SIZE);
    } else
        printf("segment contains: \"%s\"\n", data);

    /* detach from the segment: */
    if (shmdt(data) == -1) {
        perror("shmdt");
        exit(1);
    }

    return 0;
}

そして、あるプロセスがそれに書き込み、別のプロセスがそこから読み取るたびに(およびその逆)。

私が使用したい変更や機能について説明してもらえますか?

システムコールの使用は許可されていないことに注意してくださいopen/close/read/write...

とても有難い

4

0 に答える 0