代码之家  ›  专栏  ›  技术社区  ›  kiner_shah Ahamed Raaseem

读取锁定文件失败,错误号为ebadf

  •  -1
  • kiner_shah Ahamed Raaseem  · 技术社区  · 6 年前

    我试图编写一个测试程序来测试文件锁定是否正常工作。但是,其中一个测试失败了。我试图获取一个文件的读锁,但测试失败。当我试图打印错误号码时,它打印了 9 它表明 EBADF 即错误的文件号(或文件描述符)。我还试着打印文件描述符值,它打印了 3 这似乎是一个有效的文件描述符。我正在使用netbeans ide及其简单的测试功能。

    要读取的文件与源代码文件位于同一文件夹中。

    这是我的代码:

    #include <stdlib.h>
    #include <iostream>
    #include <sys/file.h>
    #include <sys/unistd.h>
    using namespace std;
    /*
     * Simple C++ Test Suite
     */
    int acquireRLock(int fd, struct flock &lock) {
        lock.l_len = 0;
        lock.l_start = 0;
        lock.l_whence = SEEK_SET;
        lock.l_type = F_RDLCK;
        struct flock temp_lock = lock;
        fcntl(fd, F_GETLK, &temp_lock);
        if(temp_lock.l_type == F_WRLCK) {
            return -1;
        }
        else {
            int ret_val = fcntl(fd, F_SETLK, &lock);
            if(ret_val == -1) cout << "Failed here errno = " << errno << " fd = " << fd << endl;
            return ret_val;
        }
    }
    int acquireWLock(int fd, struct flock &lock) {
        lock.l_len = 0;
        lock.l_start = 0;
        lock.l_whence = SEEK_SET;
        lock.l_type = F_WRLCK;
        struct flock temp_lock = lock;
        fcntl(fd, F_GETLK, &temp_lock);
        if(temp_lock.l_type == F_RDLCK || temp_lock.l_type == F_WRLCK)
            return -1;
        else
            return fcntl(fd, F_SETLK, &lock);
    }
    int FileOpenTest() {
        int fd = open("test_file.txt", O_WRONLY);
        if(fd == -1) {
            cout << "%TEST_FAILED% time=0 testname=FileOPenTest (newsimpletest) message=file open failed" << endl;
        }
        return fd;
    }
    void FileReadLockTest(int fd) {
        struct flock lock;
        if(acquireRLock(fd, lock) < 0) {
            cout << "%TEST_FAILED% time=0 testname=FileReadLockTest (newsimpletest) message=file read lock acquire failed" << endl;
        }
    }
    void FileWriteLockTest(int fd) {
        struct flock lock;
        if(acquireWLock(fd, lock) < 0) {
            cout << "%TEST_FAILED% time=0 testname=FileWriteLockTest (newsimpletest) message=file write lock acquire failed" << endl;
        }
    }
    void FileWriteTest(int fd) {
        if(write(fd, (void*) "I am a ball", 13) <= 0) {
            cout << "%TEST_FAILED% time=0 testname=FileWriteTest (newsimpletest) message=file write failed" << endl;
        }
    }
    void FileCloseTest(int fd) {
        if(close(fd) < 0) {
            cout << "%TEST_FAILED% time=0 testname=FileCloseTest (newsimpletest) message=file close failed" << endl;
        }
    }
    int main(int argc, char** argv) {
        std::cout << "%SUITE_STARTING% newsimpletest" << std::endl;
        std::cout << "%SUITE_STARTED%" << std::endl;
    
        std::cout << "%TEST_STARTED% FileOpenTest (newsimpletest)" << std::endl;
        int fd = FileOpenTest();
        std::cout << "%TEST_FINISHED% time=0 FileOpenTest (newsimpletest)" << std::endl;
    
        std::cout << "%TEST_STARTED% FileReadLockTest (newsimpletest)\n" << std::endl;
        FileReadLockTest(fd);
        std::cout << "%TEST_FINISHED% time=0 FileReadLockTest (newsimpletest)" << std::endl;
    
    //    std::cout << "%TEST_STARTED% FileWriteLockTest (newsimpletest)\n" << std::endl;
    //    FileWriteLockTest(fd);
    //    std::cout << "%TEST_FINISHED% time=0 FileWriteLockTest (newsimpletest)" << std::endl;
    //    
    //    std::cout << "%TEST_STARTED% FileWriteTest (newsimpletest)\n" << std::endl;
    //    FileWriteTest(fd);
    //    std::cout << "%TEST_FINISHED% time=0 FileWriteTest (newsimpletest)" << std::endl;
    
        std::cout << "%TEST_STARTED% FileCloseTest (newsimpletest)\n" << std::endl;
        FileCloseTest(fd);
        std::cout << "%TEST_FINISHED% time=0 FileCloseTest (newsimpletest)" << std::endl;
    
        std::cout << "%SUITE_FINISHED% time=0" << std::endl;
    
        return (EXIT_SUCCESS);
    }
    

    它显示以下输出:

    Output

    在取消注释获取写锁的代码时,将获取写锁并写入文件,读锁仍将失败,如下面的输出所示。但是,实际的行为应该是读锁成功和写锁失败:

    enter image description here

    请帮助我找出考试不及格的原因。

    1 回复  |  直到 6 年前
        1
  •  2
  •   super    6 年前

    man page for fcntl 我们可以阅读

    为了放置读取锁,FD必须打开读取。整齐 要放置写锁,fd必须打开以便写入。同时放置 类型锁定,以读写方式打开文件。

    你正在打开文件

    int fd = open("test_file.txt", O_WRONLY);
    

    man page for open

    仅限于 仅供阅读。

    奥沃伦 只允许写作。

    奥杜尔 开放阅读和写作。如果将此标志应用于fifo,则结果未定义。

    要放置读写锁,请使用

    int fd = open("test_file.txt", O_RDWR);