0

私は、(実行されるたびに) 1 つのプロセスのみを使用し、ファイルの名前 (ftok()関数) であるキーを使用してセマフォを作成し、ファイルに行を書き込む単純なプログラムを持っています。問題は、セマフォ (この場合は 2) が 2 つのことをしなければならないということです: 1 つは同時に 2 つ以上のプログラムが書き込まれないことを保証する必要があり、もう 1 つは最大 10 行だけが書き込まれたことを確認する必要があります。ファイル。したがって、プログラムを実行すると、ファイルに既に 10 行のテキストがある場合、何も書き込まれません。

これは私のコードです:

#include "semaphores.h"

int main() {
    int semaphoreLines = create_semaphore(ftok("Ex5.c", 0), 10);
    int semaphoreWrite = create_semaphore(ftok("Ex5.c", 1), 1);
    FILE *file;

    int ret_val = down(semaphoreLines, 1);
    if(ret_val != 0) {
        printf("No more lines can be written to the file!\n");
        exit(-1);
    }

    down(semaphoreWrite, 1);
    file = fopen("Ex5.txt", "a");
    fprintf(file, "This is process %d\n", getpid());
    fclose(file);
    up(semaphoreWrite, 1);
    return 0;
}

初めて実行すると、semaphoreLines(意図したとおり) 9 になり、0 にロックさsemaphoreWriteれ (他のプロセスがファイルに書き込めなくなります)、後者を書き込み、解放して 1 に戻します。プロセスは終了します。ターミナルで再度実行するように手動で指示します。ただし、semaphoreLines9 である必要があるためdown()、それを実行すると 8 などになります。問題は、再び 10 に戻ることです。私はこれをしたくありません。

私がセマフォプログラミングにかなり慣れていないためかもしれませんが、0キーで作成されない場合、セマフォは公開されていると思いました。を使用してftok()、プログラムを再度実行すると、可能であればデクリメントして書き込み、そうでない場合はエラーコードを表示して終了するように、公開したかったのです。つまり、セマフォは削除されないので、プログラムが 2 回目に実行されると、セマフォの値は 9 になるはずですよね...?

10個のプロセスをフォークして、同じプログラム内のファイルに1つずつ書き込む必要はありません...またはそれを行う唯一の方法ですか?

PScreate_semaphore()関数はsemaphores.hヘッダー ファイルの一部であり、私が作成した 4 つの単純な関数が含まれているため、作業するたびに semget、semop、semctl などをすべて実行する代わりに、セマフォを使用する方が簡単です。

4

1 に答える 1

0

問題は、再び 10 に戻ることです。私はこれをしたくありません。

これを望まない場合は、しないでください。あなた自身が でセマフォ値を 10 に設定していますcreate_semaphore()。代わりに、IPC_CREAT に加えて IPC_EXCL を に渡します。semget()これにより errno EEXIST が返された場合は、から戻っcreate_semaphore()semctl(SETVAL).

于 2014-03-21T13:40:30.397 に答える