Как отметил CesarB, Unix сбрасывает биты, которые установлены в umask процесса, поэтому, чтобы получить полный доступ, вам придется сбросить umask - временно.
mode_t oldmask = umask(0);
fd = open(...);
oldmask = umask(oldmask);
assert(oldmask == 0);
(ОК; вам не нужно делать утверждение; оно не сработает.)
Как отметил Пистос, создание файлов в / tmp - сложный процесс. Если вы считаете, что файла еще не было, добавьте O_EXCL, чтобы избежать следующих символических ссылок в неожиданных местах.
И последнее замечание - зачем вам делать исполняемый файл? Я думаю, что вы должны стремиться только к 666 разрешениям, а не к 777 или 766. Вы, безусловно, не должны запускать программы, которые другие могут изменить в любое время (поэтому владелец не должен иметь разрешения на выполнение файла, в который другие могут писать), и члены группы, вероятно, тоже не оценят щедрость. Другие могут, возможно, получить то, что они заслуживают, если они выполнят файл - но это все равно нехорошо.