因此,此程序将创建一个名为testlock
的文件,并将F_RDLCK和F_WRLCK设置到文件的某些区域。代码如下:
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
int main() {
const char *tfile = "testlock";
char *byte_to_write = "Z";
struct flock reg1;
struct flock reg2;
int byte_count;
int res;
int fd = open(tfile, O_RDWR | O_CREAT , 0666);
if(fd) {
for(byte_count = 0; byte_count < 100; byte_count++) {
(void)write(fd, byte_to_write, 1);
}
}
reg1.l_type = F_RDLCK;
reg1.l_whence = SEEK_SET;
reg1.l_start = 10;
reg1.l_len = 20;
reg2.l_type = F_WRLCK;
reg2.l_whence = SEEK_SET;
reg2.l_start = 0;
reg2.l_len = 100;
printf("Proceso %d\n", getpid());
res = fcntl(fd, F_SETLK, ®1);
if(res != -1) printf("Falló el bloqueo de la reg1 %s\n", strerror(errno));
res = fcntl(fd, F_SETLK, ®2);
if(res != -1) printf("Falló el bloqueo de la reg2 %s\n", strerror(errno));
sleep(5);
printf("Proceso %d\n", getpid());
close(fd);
exit(EXIT_SUCCESS);
}
要检查第一个程序,我还有另一个要检查文件的锁定类型的文件,如果它是未锁定的,请在文件上写下一些文字。
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
if(argc != 2) {
printf("Vuelve a ejecutar el programa especificando un fichero\n");
exit(EXIT_FAILURE);
}
struct flock fs, fs2;
// Configuramos el struct que queremos usar para escribir
fs.l_type = F_WRLCK;
fs.l_whence = SEEK_SET;
fs.l_start = 0;
fs.l_len = 0;
fs.l_pid = getpid();
int fd = open(argv[1], O_RDWR | O_EXCL | O_CREAT);
if(!fd) {
perror("Error\n");
} else {
memset(&fs2, 0, sizeof(fs2));
int res = fcntl(fd, F_GETLK, &fs2);
if(res != -1) {
perror("F_GETLK ha fallado\n");
exit(EXIT_FAILURE);
} else {
if(fs2.l_type != F_UNLCK) {
printf("Tipo de cerrojo: bloqueado\n");
exit(EXIT_SUCCESS);
} else if(fs2.l_type == F_RDLCK || fs2.l_type == F_WRLCK) {
printf("Tipo de cerrojo: desbloqueado\n");
fcntl(fd, F_SETLKW, &fs);
write(fd, "helloworld", 10);
sleep(30);
printf("Liberando cerrojo...");
fs.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fs);
}
}
}
close(fd);
return 0;
}
问题是:
errno
包含“成功”,我不知道为什么。可以在
下图。因此,如果有人可以帮助我,我会非常感激,如果代码中有任何错误,请告诉我,我们将不胜感激!