3

私はプロセス間通信でファイルのロックを使用しています。次のコードは私を悩ませます... Macintoshのターミナルを介して実行すると

    #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 f1 = {F_WRLCK , SEEK_SET , 0 , 0 , 0};
    int fd;

  f1.l_pid = getpid() ;

// if command line arguments  , then assign a Read Lock
if (argc > 1)
{
    f1.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 , &f1)  == -1)
{
    perror("fcntl");
    exit(1);
}


printf("got lock !\n");
printf("Press <RETURN> to release lock:");
getchar();

f1.l_type = F_UNLCK ; //set to unlock same region

if (fcntl(fd, F_SETLK , &f1) == -1)
{
    perror("fcntl");
    exit(1);
}

printf("Unlocked .. \n");
close(fd);

return 0;
 }

しかし、次のエラーが表示されます: fnctl: 無効な引数

この質問で私を助けてください...

4

2 に答える 2

3

MacO では、メンバーのstruct flock順序が Linux とは異なります。

コードを移植可能にするには、フィールドを名前で割り当て、特定の順序を想定しないようにする必要があります。

fcntl の MacOS Man ページから:

         struct flock {
             off_t       l_start;    /* starting offset */
             off_t       l_len;      /* len = 0 means until end of file */
             pid_t       l_pid;      /* lock owner */
             short       l_type;     /* lock type: read/write, etc. */
             short       l_whence;   /* type of l_start */
         };
于 2013-01-16T10:26:20.460 に答える
0

私はあなたのコードを試してみましたが、Linux Min 12 64 ビットでは何も変更しなくても問題なく動作します。

 gcc lock.c 
-Compaq-6200-Pro-MT-PC ~/Dropbox/Misc $ ./a.out 1
Press <RETURN> to try to get lock
trying to get lock...got lock !
Press <RETURN> to release lock:
Unlocked .. 
-Compaq-6200-Pro-MT-PC ~/Dropbox/Misc $ ./a.out
Press <RETURN> to try to get lock
trying to get lock...got lock !
Press <RETURN> to release lock:
Unlocked .. 

もちろん、同じフォルダーに lockdemo.c ファイルを作成しました。

Mac のロック API に問題があるようです。

于 2013-01-16T10:17:32.133 に答える