Есть ли лучшая альтернатива fork (), а затем execvp ("gcc program.c")? - PullRequest
0 голосов
/ 26 июня 2009

Следующий сегмент кода занимает больше времени (5 с) при первом запуске и занимает меньше времени (250 мс) при последовательных запусках. Есть ли лучший способ выполнить GCC.

int pid,status;
char * argv[] = {"gcc","program.c",NULL};
if(!(pid=fork())){
    execvp("gcc",argv);
}
while(pid!=wait(&status)){
    //do nothing
}

Ответы [ 3 ]

3 голосов
/ 26 июня 2009

Ну, я так не думаю. 5 секунд с первого раза - это, вероятно, время, чтобы прочитать все с диска в память. Сам компилятор, источники для компиляции, заголовки для включения, библиотеки для ссылок и т. Д. Он разбросан по всему диску, поэтому дисковые головки должны искать много. Это медленно.

После этого все данные, кэшированные в ОЗУ, просто анализируются и компилируются и, вероятно, становятся загруженными ЦП, а не связанными с дисковым вводом-выводом.

1 голос
/ 26 июня 2009

Нет другого способа сделать это, если бы он работал в разных версиях Unix. Для запуска отдельного процесса вы должны использовать fork-exec - для этого они и предназначены.

0 голосов
/ 26 июня 2009

Существуют и другие функции, которые вы можете вызывать (std::system - одна), но обычно они реализуются как fork и exec.

...