S_IRUSR is defined in sys/stat.h
This is internally consistent, but does not match what POSIX says. POSIX says only <sys/shm.h> is required and the permissions should be coded using octal constants (yuck). However, if a programmer wants to use S_IRUSR and the like, that is fine. POSIX defines the exact values these constants should have. I don't think POSIX needs to be followed exactly in this.
Note that <sys/ipc.h> can safely be removed from this list. POSIX says <sys/shm.h> should include <sys/ipc.h> and that is what we implement.
Also, it seems like <sys/types.h> can be removed. A shmget() invocation will compile and run with only #include <sys/shm.h>.