fcntl works in linux but not in mac os x


 
Thread Tools Search this Thread
Top Forums Programming fcntl works in linux but not in mac os x
# 1  
Old 03-06-2009
fcntl works in linux but not in mac os x

Hi,

Unless I am missing some serious differences in Mac and linux in terms of C programming, I dont know why this would happen. Please take a look at the following piece of code fragment:

Code:
bool add_input_to_db(Cons *new_data) {
  // Set the attributes of the lock 	
  struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0};	 
  int fd = open(LOGFILE, O_APPEND | O_SYNC | O_CREAT | O_WRONLY, 0600);
  if (fd == -1) {
    perror(LOGFILE);
    return false;
  }
  // Get our PID
  fl.l_pid = getpid();
  // Return false on error
  if (fcntl(fd, F_SETLKW, &fl) < 0){
     perror("fcntl");
     return false;
  }
  FILE *database = fdopen(fd, "a");
  int result = write_questions(new_data, database, false);
  // Set to unlock before closing the file
  fl.l_type = F_UNLCK;
  if (fcntl(fd, F_SETLK, &fl) < 0){
     perror("fcntl");
     return false;
  }
  fclose(database);
  return (bool) result;
}

This function is part of a bigger programs that takes in user input and logs it into a file. As you might see, I am trying to get an write lock on the logfile as soon as it opens and release the lock before the file is closed. When I run it on linux (ubuntu hardy), the program runs without any problems. However, when I run it on my mac (Leopard), I get:
Code:
fcntl: Invalid argument

If someone could explain why this would be, it'd be helpful.

Thanks.
# 2  
Old 03-06-2009
I'd suggest assigning members of fl instead of giving fl a definition block. It's possible the layout of a flock structure has members before the standard ones on osx.
# 3  
Old 03-07-2009
Quote:
Originally Posted by Corona688
I'd suggest assigning members of fl instead of giving fl a definition block. It's possible the layout of a flock structure has members before the standard ones on osx.
Hi,

You were right. I did not notice it earlier, but when I checked the manpage for fcntl, the struct members were in different order in mac than in linux.

I wonder why they would do that though..
Thanks.
# 4  
Old 03-08-2009
POSIX standards specify what has to be in a struct, the standards do not restrict additional struct members.

From POSIX on struct fl:
Code:
The structure flock describes a file lock. It shall include the following members:

short  l_type   Type of lock; F_RDLCK, F_WRLCK, F_UNLCK. 
short  l_whence Flag for starting offset. 
off_t  l_start  Relative offset in bytes. 
off_t  l_len    Size; if 0 then until EOF. 
pid_t  l_pid    Process ID of the process holding the lock; returned with F_GETLK. 

The mode_t, off_t, and pid_t types shall be defined as described in <sys/types.h>.

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Hardware

Does this hardware works with Linux

Hello folks, I pretend acquire this hardware: 1-Motherboard Asus Skt1151 - H110M-A/M.2 (https://www.asus.com/pt/Motherboards...cifications/); 2-Intel i5 6400 2.7Ghz QuadCore Skt1151; or 2-Intel i5 6500 3.2Ghz QuadCore Skt1151; 3-Dimm 8GB DDR4 Kingston CL15 2133Mhz; Obvious I pretend... (1 Reply)
Discussion started by: enodev
1 Replies

2. Shell Programming and Scripting

Why statement works in LINUX and not UNIX?

Hello, I have a ksh script that uses code below. For some reason it works under linux but fails in unix. Any idea why? if ]; then ... Thanks (9 Replies)
Discussion started by: rdogadin
9 Replies

3. Linux

Block with fcntl

Good evening, friends I'm learning with a book: Programming Linux by Kurt Wall (Prentice Hall) The code below could run in two windows (./lockit /tmp/foo in both for example). There is not problem with the read block (first byte) but when one, apply the write block while in the other is... (1 Reply)
Discussion started by: joe_cosmo
1 Replies

4. Shell Programming and Scripting

sed command works on Fedora/Ubuntu, but doesn't work in Mac

Hi, I have a question. I define a function using sed command: replace() { searchterm=$1 replaceterm=$2 sed -e "s/$searchterm/$replaceterm/ig" $3 > $WORK'tempfile.tmp' mv $WORK'tempfile.tmp' $3 } Then I call replace 'test = 0' 'test = 1' $myfile This code... (1 Reply)
Discussion started by: Dark2Bright
1 Replies

5. Shell Programming and Scripting

sed command works on Fedora/Ubuntu, but doesn't work in Mac

Hi, I have a question. I define a function using sed command: replace() { searchterm=$1 replaceterm=$2 sed -e "s/$searchterm/$replaceterm/ig" $3 > $WORK'tempfile.tmp' mv $WORK'tempfile.tmp' $3 } Then I call replace 'test = 0' 'test = 1' $myfileThis code works well in... (1 Reply)
Discussion started by: Dark2Bright
1 Replies

6. Shell Programming and Scripting

File Locking with fcntl on Darwin Mac OSX

Hello I have a Perl script that works on non-darwin Mac OS X environments and I think I have narrowed down the issue to a file locking problem. In other linux environments, the flock struct is defined differently. I have adjusted this via the reference for Mac OS X fcntl(2) man page. The... (4 Replies)
Discussion started by: flagman5
4 Replies

7. Shell Programming and Scripting

awk -F works on Linux, but not on Solaris

Hello, I found this command works on Linux: $ echo `uptime` | awk -F "load average: " '{ print $2 }' 1.60, 1.53, 1.46 but got error on Solaris: $ echo `uptime` | awk -F "load average: " '{ print $2 }' awk: syntax error near line 1 awk: bailing out near line 1 $ which awk... (2 Replies)
Discussion started by: seafan
2 Replies

8. Programming

fcntl on socket

I have very simple client - server setup, where client connects, exchanges some messages with the server and then closes socket and exits. Everythink works OK, except when I am trying to change socket to be non-blocking AND the shell happens to be plain old Bourne. It runs no problem under ksh or... (3 Replies)
Discussion started by: migurus
3 Replies

9. Shell Programming and Scripting

Script works on Solaris, not on Linux

I'm in the same boat as Barbus - same exercis (https://www.unix.com/shell-programming-scripting/43609-processes-users.html) The following script works on a solaris server I have access to. It doesn't however, work on the companies Linux machine. Any idea what's up? I have very little shell... (0 Replies)
Discussion started by: Silverhood
0 Replies

10. Programming

I have no clue what's the point - fcntl() ?

hi, I need to know how to lock a file. I used the following code, but after executing the program the file 'write.txt' remined empty, and I have no idea why.Maybe I'm not using the corresponding syntax for blocking a file. But I deleted then the blocking part and the problem persisted. see to... (2 Replies)
Discussion started by: atticus
2 Replies
Login or Register to Ask a Question