There isn't a standard way to configure the kernel and we have: ioctls ioctl(fd,....). I.E. you must get a file descriptor. So to configure global networking parameters, you create a socket and operate on that. A major wart IMHO, and not at all intuitive. sysctls sysctl() or the /proc/sys mirror (why use sysctl()?) /proc/files various non standard placed/named/format files. /dev/files /dev/inet/* /dev/route ... used to configure various things. I think any configuration can be presented/performed adequately using a file based interface, which has the advantage that scripts can use it, and is much simpler. But most importantly is generic, so generic abstraction code can be written between the kernel and userspace. Since ioctls and sysctls do everything, they have no type checking, and return non standard parameters, i.e. completely negating any advantage over a file based interface that they could possibly have. (look back at MAC address code to see how complex ioctls are). Also configuration for specific files (streams of data) is done using fcntl which is fine. But what about the setsockopt() wart?