_locking
Mengunci atau membuka kunci byte file.
Sintaks
int _locking(
int fd,
int mode,
long nbytes
);
Parameter
fd
Pendeskripsi file.
mode
Mengunci tindakan untuk dilakukan.
nbytes
Jumlah byte yang akan dikunci.
Nilai hasil
_locking
mengembalikan 0 jika berhasil. Nilai pengembalian -1 menunjukkan kegagalan, dalam hal errno
ini diatur ke salah satu nilai berikut.
errno nilai |
Kondisi |
---|---|
EACCES |
Mengunci pelanggaran (file sudah terkunci atau tidak terkunci). |
EBADF |
Pendeskripsi file tidak valid. |
EDEADLOCK |
Mengunci pelanggaran. Dikembalikan saat _LK_LOCK bendera atau _LK_RLCK ditentukan dan file tidak dapat dikunci setelah 10 upaya. |
EINVAL |
Argumen yang tidak valid diberikan kepada _locking . |
Jika kegagalan disebabkan oleh parameter yang buruk, seperti deskriptor file yang tidak valid, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter.
Keterangan
Fungsi _locking
mengunci atau membuka kunci nbytes
byte file yang ditentukan oleh fd
. Mengunci byte dalam file mencegah akses ke byte tersebut oleh proses lain. Semua penguncian atau pembukaan kunci dimulai pada posisi penunjuk file saat ini dan melanjutkan untuk byte berikutnya nbytes
. Dimungkinkan untuk mengunci byte melewati akhir file.
mode
harus menjadi salah satu konstanta manifes berikut, yang didefinisikan dalam Locking.h.
mode nilai |
Efek |
---|---|
_LK_LOCK |
Mengunci byte yang ditentukan. Jika byte tidak dapat dikunci, program segera mencoba lagi setelah 1 detik. Jika byte tidak dapat dikunci setelah 10 upaya, konstanta mengembalikan kesalahan. |
_LK_NBLCK |
Mengunci byte yang ditentukan. Jika byte tidak dapat dikunci, konstanta mengembalikan kesalahan. |
_LK_NBRLCK |
Sama seperti _LK_NBLCK . |
_LK_RLCK |
Sama seperti _LK_LOCK . |
_LK_UNLCK |
Membuka kunci byte yang ditentukan, yang sebelumnya harus dikunci. |
Beberapa wilayah file yang tidak tumpang tindih dapat dikunci. Wilayah yang tidak terkunci harus telah dikunci sebelumnya. _locking
tidak menggabungkan wilayah yang berdekatan; jika dua wilayah terkunci berdekatan, setiap wilayah harus dibuka secara terpisah. Wilayah harus dikunci hanya sebentar dan harus dibuka kuncinya sebelum menutup file atau keluar dari program.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Persyaratan
Rutin | Header yang diperlukan | Header opsional |
---|---|---|
_locking |
<io.h> dan <sys/locking.h> | <errno.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Pustaka
Semua versi pustaka run-time C.
Contoh
// crt_locking.c
/* This program opens a file with sharing. It locks
* some bytes before reading them, then unlocks them. Note that the
* program works correctly only if the file exists.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/locking.h>
#include <share.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main( void )
{
int fh, numread;
char buffer[40];
/* Quit if can't open file or system doesn't
* support sharing.
*/
errno_t err = _sopen_s( &fh, "crt_locking.txt", _O_RDONLY, _SH_DENYNO,
_S_IREAD | _S_IWRITE );
printf( "%d %d\n", err, fh );
if( err != 0 )
exit( 1 );
/* Lock some bytes and read them. Then unlock. */
if( _locking( fh, LK_NBLCK, 30L ) != -1 )
{
long lseek_ret;
printf( "No one can change these bytes while I'm reading them\n" );
numread = _read( fh, buffer, 30 );
buffer[30] = '\0';
printf( "%d bytes read: %.30s\n", numread, buffer );
lseek_ret = _lseek( fh, 0L, SEEK_SET );
_locking( fh, LK_UNLCK, 30L );
printf( "Now I'm done. Do what you will with them\n" );
}
else
perror( "Locking failed\n" );
_close( fh );
}
Input: crt_locking.txt
The first thirty bytes of this file will be locked.
Sampel output
No one can change these bytes while I'm reading them
30 bytes read: The first thirty bytes of this
Now I'm done. Do what you will with them