The goal of standardisation for C was in part to aid portability. That worked out to some degree. So thats the best place to start. The goal of POSIX was to standardize UNIX system interfaces across the various flavors. That worked out to some degree also. You also need to to get the interfaces for Windows, Linux and so forth because they all have various 'innovations' that have been created which are not adherent to any standard or portable.
At a minimum you should become familiar with the fallowing material.
* ISO/IEC 9899:1999 - ISO/IEC 9899:2011 http://www.open-std.org/jtc1/sc22/wg14/
* POSIX.1-2008 / IEEE Std 1003.1 http://pubs.opengroup.org/onlinepubs/9699919799/
* Linux system interfaces http://man7.org/linux/man-pages/
* Win API/Win32 API https://msdn.microsoft.com/en-us/library/windows/desktop/ff8...
Thats a lot of reading. A good starting point for a project is to code to the C standard and one abstract interface that wraps your main target OS. Then port portions of the implamentation for your interface to the various systems you need to run on. In reality there are a lot of specific factors that you need to take into account to design your portability strategy.