0

共有メモリを使用する 3 つのプロセス A、B、C を作成する必要があります。A と B は共有メモリに 100 個の整数を書き込み、C はそれらを読み取り、バイナリ ファイルに書き込みます。それは私が作ったものですが、うまく動作しません。<stdio.h><math.h><fcntl.h>およびが含まれ<time.h>ます。それを機能させる方法は?

struct sync
{
    int n;
    int lock;
    int generated;
    char process;
} *b;

int testandset(int* lockPtr)
{
    int oldValue = *lockPtr;

    return 0 != oldValue;
}

int main()
{
    struct sync buff;
    int pid, ppid, fp, i;

    srand(time(NULL));

    b = (struct sync*)malloc(666);
    b->n = 0;
    b->lock = 0;
    b->generated = 0;

    i = 0;

    printf("Generating numbers\n");

    pid = fork();

    if (0 == pid)
    {
        while (100 >= b->generated)
        {
            while (testandset(&(b->lock)))
            {

            }

            buff.n = rand() % 1001;
            buff.process = 'A';

            fp = open("db", O_RDWR | O_APPEND);

            if (-1 == fp)
                fp = open("db", O_CREAT);

            write(fp, &buff, sizeof(struct sync));      

            close(fp);

            b->generated++;
            b->lock = 0;
        }
    }

    if (0 < pid)
    {
        ppid = fork();

        if (0 == ppid) 
        {
            while (100 >= b->generated)
            {
                while (testandset(&(b->lock)))
                {

                }

                buff.n = rand() % 1001;
                buff.process = 'B';

                printf("No: %d %d \n", ++i, buff.n);

                fp = open( "db", O_RDWR | O_APPEND );

                if (-1 == fp)
                    fp = open("db", O_CREAT);

                write(fp, &buff, sizeof(struct sync));      

                close(fp);

                b->generated++;
                b->lock = 0;
            }
        }

        if (0 < ppid)
        {
            wait();

            i = 0;

            fp = open("db", O_RDONLY, 0755);

            printf("Reading from file\n");

            while (read(fp, &buff, sizeof(struct sync)))
            {
                if ('A' == buff.process)
                    i++;
            }

            close(fp);

            int vals[i];

            i = 0;

            fp = open("db", O_RDONLY, 0666);

            while (read(fp, &buff, sizeof(struct sync)))
            {
                if ('A' == buff.process)
                    vals[i++] = buff.n;
            }

            close(fp);

            fp = open("db", O_RDONLY, 0455);

            int i;

            for(i = 0; i < i; i++)
                write((const void*) &vals[i],sizeof(int),1,fp);
        }

        wait();
    }

    return 0;
}
4

2 に答える 2

1

マルチプロセスで情報を共有する (同時に編集する) 場合、ファイルは実際には信頼できません。実際のデータベースをトランザクション モードで使用するか、IPC http://www.cs.cf.ac.uk/Dave/C/を使用することをお勧めします。 node27.html。または、スレッドとミューテックスを再設計して使用することもできます。

于 2013-05-19T16:40:30.267 に答える
1

ここには多くの問題がありますが、私は に集中しtestandset()ます。まず、名前が間違っていて、何も設定されておらず、b->lockどこにも設定されていません。何のために?

プロセス間のある種のロックに使用しようとしているように思えますが、うまくいきません。フォークすると、新しい子は親のアドレス空間の完全なコピーを効果的に取得し、親の変数への変更は子には表示されず、その逆も同様です。Maresh が言うように、プロセス間通信の使用を検討する必要があります。

于 2013-05-19T17:07:25.230 に答える