Основной вопрос в заглавии. Единственное значимое отличие я увидел в том, что для splice надо чтоб один из файловых дескрипторов был pipe. Получается что sendfile для pipe работать не будет? Если так, почему б не сделать один системный вызов, который бы и к пайпам, и к сокетам, и к обычным файловым дескрипторам был применим?
Есть вообще какие-то правила, которым надо следовать в плане системных вызовов? Например если я свою ОС вздумаю написать, какие системные вызовы лучше делать? Я понимаю что есть какой-то там стандарт POSIX, SUS и проч, где оговариваются какие-то функции, но они могут быть имплементированы в glibc а не непосредственно системными вызовами.