Я пытаюсь написать программу для выполнения и планирования списка процессов. Мой код для main.c приведен ниже. При запуске я получаю сообщение от perror, говорящего, что такого файла или каталога нет. Я предполагаю, что это связано с тем, что файлы/программы в файле files.txt не являются исполняемыми файлами, но я не уверен, как это исправить. files.txt содержит список программ, которые я хочу запустить. Они все уже были преобразованы в двоичные исполняемые файлы. программы представляет собой массив, содержащий четыре программы, которые были прочитаны с помощью функции readProgramsОшибка execve: нет такого файла или каталога
int main(int argc, char ** argv) {
pid_t pid[50];
pid_t wpid;
int i, j;
int status = 0;
char *newenvp[] = {NULL};
char *newargv[] = {"./files.txt", NULL};
printf("Before forking in the parent\n");
int numProgs = readPrograms();
for (i=0; i<numProgs; i++) {
pid[i] = fork();
if (pid[i] < 0) {
perror("fork error");
exit(EXIT_FAILURE);
}
else if (pid[i] == 0) {
printf("Child process running\n");
execve(programs[i], newargv, newenvp);
perror("execve error");
exit(EXIT_FAILURE);
}
}
for (i=0; i<numProgs; i++) {
wait(&status);
}
return 0;
}
char* programs[50];
int readPrograms();
files.txt ниже
./first
./second
./third
./fourth
(я сделал «куб.см first.c -o первым» для всех из них файлы соответственно)
Используйте 'strace -f -e execve', чтобы посмотреть фактические сделанные системные вызовы. Если ошибка является тем, что подозревает @R, это будет ясно видно. (Если это не освещается, я бы снял фильтр '-e execve' и рассмотрел более общий взгляд на syscall, возвращающий ENOENT). –
... кстати, было бы более условно передавать ваш целевой файл как 'argv [1]', а не 'argv [0]'; если у него нет конкретной причины, чтобы это было иначе, 'argv [0]' по условному названию запускаемой программы. –
параметр newargv [] установлен неправильно. он должен содержать newargv [0] = программы [i]; newargv [1] = NULL; – user3629249