0

私は libapr を使用していますが、それらの基本的なプリミティブの一部がうまく機能していないようで、非常に奇妙な動作を示しています。ここに私が書いているコードがあります:

    pr_pool_t *mp=NULL;
    apr_file_t *fp = NULL;
    apr_pollset_t *pollset=NULL;
    apr_pollfd_t file_fd;

    /*apr initialization*/
    CuAssertIntEquals(ct,0,apr_initialize());
    CuAssertIntEquals(ct,0,apr_pool_create(&mp,NULL));

    /*opens file to test poll*/
    CuAssertIntEquals(ct,0,apr_file_open(&fp, FILENAME,
            APR_FOPEN_WRITE | APR_FOPEN_CREATE | APR_FOPEN_READ,
            APR_FPROT_UREAD|APR_FPROT_UWRITE|APR_FPROT_UEXECUTE , mp));

    /*creates pollset*/
    CuAssertIntEquals(ct,0,apr_pollset_create(&pollset, 10,mp,0));

    /*prepares poll fd...*/
    file_fd.desc_type = APR_POLL_FILE;
    file_fd.reqevents = APR_POLLIN|APR_POLLOUT;
    file_fd.desc.f = fp;
    file_fd.client_data = fp;

    /*adds pollfd to pollset*/
    CuAssertIntEquals(ct,0,apr_pollset_add(pollset, &file_fd));

apr_pollset_add(pollset, &file_fd) に到達するまで、すべてが正常に実行され、失敗して値 1 が返されます。

この関数のソース コードを分析すると、決して 1 が返されないことがわかります。実際には、システム エラーとして 1 が返されます。これは、libapr ルーチン apr_sterror を使用して、「操作は許可されていません」に変換されます。

私はこの問題を解決しようとしてほとんど寝たり食べたりしませんでしたが、成功しませんでした. 私は本当にこのライブラリを使用する必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

1

問題が見つかりました。

通常のファイルをポーリングしていました。通常のファイルは、常に読み取りまたは書き込みの準備が整っています

1 は、poll_ctl が呼び出されたときに設定される、許可されていない操作に対応します。

于 2012-12-21T03:58:30.813 に答える