• Các quyền truy nhập
2.5 Hạn chế quyền truy nhập trên qile
• Tiến trình muốn kiểm soát truy nhập trên một phần của }ile hay toàn bộ }ile để tránh xung đột khi có nhiều tiến trình cùng truy nhập trên }ile.
• Unix/Linux cung cấp cơ chế khóa mềm: Mọi tiến trình đều có quyền giành được khóa và thao tác trên }ile, tuy nhiên không phải tiến trình nào cũng tuân thủ theo khóa và có thể phá hỏng dữ liệu của tiến trình khác.
• Windows thực hiện vấn đề này tốt hơn bằng khóa cứng. Có hai loại khóa:
• Shared Lock: Cho phép các tiến trình khác (kể cả tiến trình giành được khóa) đọc nhưng không được ghi vào một phần đã khóa của }ile.
• Exclusive Lock : Cấm tất cả các tiến trình khác không được đọc hay ghi vào phần đã khóa của }ile. Tiến trình giành được khóa có quyền đọc hoặc ghi
• Các hàm khóa }ile trên Windows
• LockFile, UnlockFile: Khóa và mở khóa đồng bộ, sẽ không trở về đến khi giành được khóa hoặc mở được khóa.
• LockFileEx, UnlockFileEx: Khóa và mở khóa đồng bộ hoặc bất đồng bộ.
• Khóa }ile cũng có thể xác định lúc tạo lập/truy nhập }ile thông qua hàm CreateFile.
• Đoạn chương trình sau sẽ mở một }ile để đọc với chế độ Shared Lock.
char buff[1024]; DWORD bytesRead = 0; HANDLE fileHandle = NULL;
fileHandle = CreateFile(L"C:\\SecureProgramming\\Test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 2.6 Khóa qile
• VD (tiếp)
ReadFile(fileHandle,buff,128,&bytesRead,0); buff[bytesRead] = 0;
printf("File content:%s\n",buff);
LockFile(fileHandle,0,0,100,0); // Exclusive Lock
printf("File is locked, press any key to unlock...\n"); getch();
UnlockFile(fileHandle,0,0,100,0); printf("File is unlocked\n");
getch();
CloseHandle(fileHandle);
• Ứng dụng tạo }ile tạm để lưu trữ thông tin tạm thời của chương trình.
• File tạm nên được tạo lập một cách an toàn, và xóa khi kết thúc chương trình.
• Trên unix/linux:
• Hàm mkstemp() có thể sử dụng để tạo }ile tạm với tên ngẫu nhiên.
• Ứng dụng cần xóa }ile theo tên, ngay sau lời gọi mkstemp để đảm bảo không tiến trình nào truy nhập được.
• Sau khi tiến trình kết thúc một cách bình thường/không bình thường, }ile tạm sẽ không thể truy nhập được nữa.
• VD
char szPath[] = “fileXXXXXX"; int fd;
fd = mkstemp(szPath); unlink(szPath);
printf("Temperary file created, press any key to continue..."); write(fd,"Hello",5);
close(fd);
• Trên Windows:
• Không có hàm tương đương mkstemp()
• GetTempFileName() sinh tên }ile ngẫu nhiên nhưng dễ đoán.
• GetTempPath() lấy đường dẫn đến thư mục tạm của người dùng hiện tại.
• Tạo }ile bằng hàm CreateFile với hai thuộc tính FILE_ATTRIBUTE_TEMPORARY và