2014-10-29 4 views
0

Я пытаюсь написать программу для выполнения и планирования списка процессов. Мой код для 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 первым» для всех из них файлы соответственно)

+0

Используйте 'strace -f -e execve', чтобы посмотреть фактические сделанные системные вызовы. Если ошибка является тем, что подозревает @R, это будет ясно видно. (Если это не освещается, я бы снял фильтр '-e execve' и рассмотрел более общий взгляд на syscall, возвращающий ENOENT). –

+0

... кстати, было бы более условно передавать ваш целевой файл как 'argv [1]', а не 'argv [0]'; если у него нет конкретной причины, чтобы это было иначе, 'argv [0]' по условному названию запускаемой программы. –

+0

параметр newargv [] установлен неправильно. он должен содержать newargv [0] = программы [i]; newargv [1] = NULL; – user3629249

ответ

1

Я подозреваю, что ошибка находится в коде, который вы не показываете, readPrograms. Скорее всего, вы читаете строки текстового файла с fgets, и каждая строка имеет новую строку на конце, тогда как ваши имена файлов не имеют в них новых строк.

+0

исправлено. очень признателен – user3192682

Смежные вопросы