Код (Text): void nop(){}; int main (int argc, char *argv[]){ /** Copyright (c) 2007 by device For=wasm.ru description: Демонстрирует блокировку **/ struct flock flp; pid_t pid; flp.l_start=10; flp.l_whence=SEEK_SET; flp.l_len=0; flp.l_type=F_WRLCK; printf("%s","Setting up LOCK file from main process..."); int fd = open ("inf",O_RDWR|O_APPEND|O_CREAT); if( (fcntl (fd,F_SETLK,&flp)) !=-1){ printf (" [ %s ]\n","ok"); }else{ printf (" [ %s ]\n","failed"); perror ("Locking file"); } if ( (pid=fork())<0){ perror("\nCreateProcess\n"); exit (1); }else if (pid>0){ // Родительский процесс printf ("\nFlockNow: parent id=<%d>\n",getpid()); flp.l_start=0; flp.l_whence=SEEK_SET; flp.l_len=0; flp.l_pid=getpid(); flp.l_type=F_WRLCK; fcntl(fd, F_SETLK, &flp)!=-1?nop():exit(2); printf ("Locked from %d now (PARENT)\n\t--Write MESSAGE_WRITE to CHILD\n",getpid()); char *msg; msg="parent_info"; write (fd, msg, strlen(msg)); printf ("parent: %d bytes written!",strlen(msg)); }else{ //Дочерний процесс printf ("\nFlockNow: child id=<%d>\n",getpid()); char *buff; buff="myinfo_child"; write (fd, buff, strlen(buff)); printf ("%d bytes written\n",strlen(buff)); printf ("%s\n","MESSAGE_WRITE to parent..."); } exit (0); } Я запретил писать в OFFSET 10, а оно пишет. Мне влом проверять валидность запрета... но ведь запускается же! Подозреваю, тут надо с F_SETLKW пооперировать.
в *nix блокировки файлов -- это лишь по желанию процесса. Вот если чайлд попробует залочить, то будет висеть и ждать пока парент отпустит блокировку. А если не попробует, то запишет и не заметит. Собственно последний вариант ты и наблюдаешь.