Есть ли у кого-нибудь идеи о том, что я здесь делаю неправильно?
Основная проблема, вероятно, состоит в том, что ваши аргументы execvp()
неверны:
char* args[] = {"\0"};
execvp("ls", args);
Есть две вещи, которые определенно не так с этим:
Массив аргументов должен заканчиваться нулевым указателем."\0"
является , а не нулевым указателем;скорее это массив, содержащий два нулевых символа , и он распадается на действительный, поэтому ненулевой, указатель.
Даже если "\0"
были нулемуказатель, у тебя будет один короткий аргумент.Первый элемент вектора аргумента с индексом 0 должен быть указателем на строку, представляющую имя программы.
Другими словами:
char* args[] = { "ls", NULL };
execvp("ls", args);
Дополнительновыполняемое вами перенаправление не согласуется с обработкой в оболочке POSIX оператора перенаправления >
.В такой форме этот оператор перенаправляет только стандартный вывод, а не стандартную ошибку.Кроме того, он должен открывать указанный файл только для записи, а не для чтения / записи, потому что запись в него - это все, что нужно программе.Открытие его для чтения / записи может привести к невозможности перенаправления в существующий файл, для которого у пользователя есть разрешения на запись, но нет прав на чтение.
Кроме того, режим файла, который вы указываете для события, когда создается новый файлтакже производит поведение, несовместимое с оболочкой POSIX.Вы должны указать разрешения на чтение / запись для пользователя, группы и других пользователей и разрешить их изменение в соответствии с действующим umask:
int fd = open("test.txt", O_WRONLY | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);