По какой-то причине flock (fd, LOCK_UN) возвращает 0, и файл все еще заблокирован со второй итерации. Таким образом, в первый раз файл разблокируется секцией записи, а секция чтения может успешно заблокировать его. Когда i = 1, секция записи больше не может разблокировать файл, и блокировка секции чтения не работает.
Я отредактировал open () следующим образом.
fd = open(filename, O_WRONLY | O_APPEND| O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
После того, как я это сделал, все блокировки и разблокировки работают. Эти параметры предоставляют пользователю права на чтение, запись и выполнение. Итак, я предполагаю, что после удаления файла что-то пойдет не так. Теперь я добавил perror () к каждой проверке, и во время второй итерации (i = 1) блокировка секции чтения завершается с ошибкой «Плохой дескриптор файла». Может кто-нибудь мне это объяснить?
// Tell the headers to use the POSIX extension
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <errno.h>
#define POLL_WAIT_TIME_S 2
const char testString[] = "Test test test\n";
int main() {
int fd; // Create file descriptor variable
char *buff = (char *) calloc(255, sizeof(char)); // Create buffer for read()
char* filename = "testfile"; // Set filename
int status;
while(1) {
// Create a file and write a text into it
fd = open(filename, O_WRONLY | O_APPEND| O_CREAT); // Create file descriptor
printf("%d\n", fd);
status = flock(fd, LOCK_EX); // Lock file using file descriptor
if(status == 0)
printf("\"%s\" locked successfully by write process!\n", filename);
else {
printf("\"%s\" not locked successfully by write process!\n", filename);
perror("Error: ");
}
size_t charsWritten = write(fd, testString, sizeof(testString)); // Write to file using file descriptor
printf("%ld characters written to \"%s\" \n", charsWritten, filename);
if(status == 0) {
status = flock(fd, LOCK_UN);
if(status == 0)
printf("\"%s\" unlocked by write process!\n", filename);
else {
printf("\"%s\" could not be unlocked by write process!\n", filename);
perror("Error: ");
}
}
close(fd); // Close file descriptor
// Open a file and read its content
fd = open(filename, O_RDONLY);
status = flock(fd, LOCK_EX); // Lock file using file descriptor
if(status == 0) {
printf("\"%s\" locked successfully by read process!\n", filename);
printf("\nReading file content: \n");
size_t sz = read(fd, buff, (size_t) sizeof(testString));
buff[sz] = '\0';
printf("%s", buff); // Print buffer content to the screen
printf("\n");
}
else {
printf("\"%s\" not locked successfully by read process!\n", filename);
perror("Error: ");
}
if(status == 0) {
status = flock(fd, LOCK_UN);
if(status == 0)
printf("\"%s\" unlocked by read process!\n", filename);
else {
printf("\"%s\" could not be unlocked by read process!\n", filename);
perror("Error: ");
}
}
close(fd);
// Delete the file
if(remove(filename) == 0)
printf("\"%s\" deleted successfully!\n", filename);
else {
printf("Unable to delete %s\n", filename);
perror("Error: ");
}
printf("\n");
sleep(POLL_WAIT_TIME_S);
}
free(buff);
return 0;
}