8

There's syscall which allows indirect system calls in Linux. What are the reasons to use it - and why is it better than direct call to the function?

Drakosha
  • 11,925
  • 4
  • 39
  • 52

1 Answers1

12

Sometimes the kernel adds system calls and it takes a while for the C library to support them.

Or maybe you are compiling on an old Linux distribution, but want to run on a newer one.

Example code:

// syscall 277 is sync_file_range() on x86_64 Linux.  The header
// files lack it on scc-suse10 where we compile, but the
// performance benefits are substantial, so we just call it
// directly.  FIXME someday.
#define SYNC_FILE_RANGE_WRITE 2
    syscall(277, fd, done, n, SYNC_FILE_RANGE_WRITE);

But in general, there is no advantage to using syscall if the C library in your compilation environment has what you need. (For one thing, it is even less portable than using a Linux-specific interface, since the system call numbers vary by CPU.)

Nemo
  • 70,042
  • 10
  • 116
  • 153
  • They shouldn't vary by CPU, only by operating system implementation. – Wug Sep 05 '12 at 16:54
  • 1
    @Wug: The actual syscall numbers vary on x86, x86_64, ARM, PPC, etc. – Nemo Sep 05 '12 at 17:47
  • That would be operating system implementation. They're not dependent on the CPU in any way, they're defined in a header somewhere and compiled into the kernel. – Wug Sep 05 '12 at 20:48
  • 1
    @Wug: The question is about the Linux "syscall" function, whose "operating system implementation" varies by CPU. Thus "the system call numbers vary by CPU" is a perfectly accurate statement. – Nemo Sep 05 '12 at 21:29