I m working with File Locking in interprocess Communication , the following code bugs me... when run through terminal in 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;
}
But the following error appears : fnctl : invalid argument
plz help me in this question...
On MacOs, the members of struct flock
have a different order than in Linux.
to make your code portable you should assign the fields by name, and not assume a particular order.
From the MacOS Man page for fcntl:
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 */
};