Не могу найти ошибку в коде на си: по смещению 10 файл не блокирован

Тема в разделе "WASM.HEAP", создана пользователем device, 12 дек 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1. void nop(){};
    2.  
    3. int main (int argc, char *argv[]){
    4.  
    5. /**
    6.  
    7. Copyright (c) 2007 by device
    8. For=wasm.ru
    9. description: Демонстрирует блокировку
    10.  
    11. **/
    12. struct flock flp;
    13. pid_t pid;
    14.  
    15. flp.l_start=10;
    16. flp.l_whence=SEEK_SET;
    17. flp.l_len=0;
    18.  
    19. flp.l_type=F_WRLCK;
    20.  
    21. printf("%s","Setting up LOCK file from main process...");
    22. int fd = open ("inf",O_RDWR|O_APPEND|O_CREAT);
    23. if( (fcntl (fd,F_SETLK,&flp)) !=-1){
    24. printf (" [ %s ]\n","ok");
    25. }else{
    26.  
    27. printf (" [ %s ]\n","failed");
    28. perror ("Locking file");
    29. }
    30.  
    31.  
    32. if ( (pid=fork())<0){
    33. perror("\nCreateProcess\n");
    34. exit (1);
    35. }else if (pid>0){
    36.  
    37. // Родительский процесс
    38. printf ("\nFlockNow: parent id=<%d>\n",getpid());
    39.  
    40. flp.l_start=0;
    41. flp.l_whence=SEEK_SET;
    42. flp.l_len=0;
    43. flp.l_pid=getpid();
    44. flp.l_type=F_WRLCK;
    45. fcntl(fd, F_SETLK, &flp)!=-1?nop():exit(2);
    46. printf ("Locked from %d now (PARENT)\n\t--Write MESSAGE_WRITE to CHILD\n",getpid());
    47.  
    48. char *msg;
    49. msg="parent_info";
    50.  
    51. write (fd, msg, strlen(msg));
    52. printf ("parent: %d bytes written!",strlen(msg));
    53. }else{
    54.  
    55. //Дочерний процесс
    56. printf ("\nFlockNow: child id=<%d>\n",getpid());
    57.  
    58. char *buff;
    59. buff="myinfo_child";
    60. write (fd, buff, strlen(buff));
    61. printf ("%d bytes written\n",strlen(buff));
    62. printf ("%s\n","MESSAGE_WRITE to parent...");
    63. }
    64.  
    65. exit (0);
    66.  
    67. }
    Я запретил писать в OFFSET 10, а оно пишет.
    Мне влом проверять валидность запрета... но ведь запускается же!
    Подозреваю, тут надо с F_SETLKW пооперировать.
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    в *nix блокировки файлов -- это лишь по желанию процесса. Вот если чайлд попробует залочить, то будет висеть и ждать пока парент отпустит блокировку. А если не попробует, то запишет и не заметит. Собственно последний вариант ты и наблюдаешь.