chmod () - правильный системный вызов, но если у вас нет прав доступа для изменения прав доступа к файлу, вам не повезло.
Как вы, конечно, можете себе представить, изменение прав доступа к файлам, на которые у вас нет прав, может создать дыру в безопасности.
Wrt setuid (), который имеет тенденцию быть ограниченным суперпользователями или программами с установленным битом setuid. Опять же, по очевидным причинам безопасности, случайный пользователь не может изменить себя на другого случайного пользователя в общем случае.
Поэтому, если вы хотите, чтобы chmod () работал без каких-либо привилегий суперпользователя, решение состоит в том, что UID процесса должен совпадать с владельцем файла, для которого вы пытаетесь изменить разрешения.