1
我試圖在unix中學習編程c。所以我通過Beejs Guide閱讀並嘗試瞭解更多關於文件鎖定的內容。unix系統中使用c和fcntl的文件鎖定
所以我剛剛從他那裏拿了一些代碼示例,並試圖讀出文件是否被鎖定,但每次我都會得到errno 22
,它代表無效的參數。所以我檢查了我的代碼中無效的參數,但我無法找到它們。有人能幫助我嗎?在這種情況
我的錯誤:
if(fcntl(fd, F_GETLK, &fl2) < 0) {
printf("Error occured!\n");
}
的完整代碼:
/*
** lockdemo.c -- shows off your system's file locking. Rated R.
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* l_type l_whence l_start l_len l_pid */
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 };
struct flock fl2;
int fd;
fl.l_pid = getpid();
if (argc > 1)
fl.l_type = F_RDLCK;
if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
perror("open");
exit(1);
}
printf("Press <RETURN> to try to get lock: ");
getchar();
printf("Trying to get lock...");
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("got lock\n");
printf("Press <RETURN> to release lock: ");
getchar();
fl.l_type = F_UNLCK; /* set to unlock same region */
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("Unlocked.\n");
printf("Press <RETURN> to check lock: ");
getchar();
if(fcntl(fd, F_GETLK, &fl2) < 0) {
printf("Error occured!\n");
}
else{
if(fl2.l_type == F_UNLCK) {
printf("no lock\n");
}
else{
printf("file is locked\n");
printf("Errno: %d\n", errno);
}
}
close(fd);
return 0;
}
我只是說fl2
和底部的一部分。
謝謝。初始化後,所有內容都正在運行。但是如果我在鎖定文件後檢查鎖,我的支票就會顯示「無鎖」。這部分是出於beejs指南,我看不到任何錯誤。 – user1550036
@ user1550036:在我的OS X上,'struct flock'的成員依次爲'l_start,l_len,l_pid,l_type,l_whence'。所以你的初始化可能是錯誤的。更好地分配成員:'fl.l_type = ...'等等。 –