Скомпилировать исходный код C в процессе

#c #unix #exec #fork

#c #unix #exec #форк

Вопрос:

Я хочу скомпилировать исходный код C в родительском процессе, а затем, после создания исполняемого файла, я хочу запустить его в дочернем процессе. Есть идеи?

Спасибо.

 #include <stdio.h>
#include <stdlib.h>

#define execle("/bin/ls","bin/ls","-l",NULL);

int main(int argc , char **argv )
{
    int i;
    for(i=1 ; i<argc ; i  )
    {
        if(argv[1]==".c")
        {
            if(fork()==0)
            {
                execle("/usr/bin/gcc","/usr/bin/gcc",argv[1],NULL);
                exit(1);
            }    
        }

        if(argv[2]==".out")
        {
            if(fork()==0)
            {
                execle("/bin/cat","bin/cat/",argv[2],NULL);
                exit(1);
            }
        }
    } 
    return 0;
}
  

Вот как выглядит код, но не могли бы вы сказать мне, почему он выдает ошибки в строках, где находится execle(..) ?

Комментарии:

1. записать его в файл, передать систему компилятору, удалить исходный файл и выполнить созданный двоичный файл (при условии, что компиляция сработала)?

2. Технически то, что вы хотите, не имеет смысла. После завершения компиляции процесс компиляции больше не будет существовать, поэтому он не сможет иметь дочерних элементов, поскольку он не будет существовать. Однако вы могли бы выполнить их оба в дочерних процессах.

Ответ №1:

В вашей родительской программе / драйвере используйте system(3) вызов или комбинацию fork/exec/wait для запуска вашего компилятора. Затем вы можете использовать те же вызовы для запуска вновь скомпилированного исполняемого файла.

При его реализации следует учитывать аспекты безопасности. Такого рода вещи обладают огромным потенциалом для использования.

Ответ №2:

 #define execle("/bin/ls","bin/ls","-l",NULL);
  

Что вы ожидаете от этой строки?

Эти две строки

 if(argv[1]==".c")
if(argv[2]==".out")
  

Не делайте то, что вы думаете

попробуйте

 if( strcmp(".c" , argv[1]) == 0 )
if( strcmp(".out" , argv[2]) == 0 )
  

Подробнее : http://www.cplusplus.com/reference/clibrary/cstring/strcmp /

Также,

 exec("/bin/cat","bin/cat/",argv[2],NULL);
  

На самом деле не существует, поэтому измените его на execle и #include <stdint.h>

Подробнее : http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

В итоге должно получиться что-то вроде :

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc , char **argv)
{
    int i;
    for(i=1 ; i<argc ; i  )
    {
        if(strcmp(".c" , argv[1]) == 0)
        {
            if(fork()==0)
            {
                execle("/usr/bin/gcc","/usr/bin/gcc",argv[1],NULL);
                exit(1);
            }    
        }

        if(strcmp(".c" , argv[1]) == 0)
        {
            if(fork()==0)
            {
                execle("/bin/cat","bin/cat/",argv[2],NULL);
                exit(1);
            }
        }
    } 
    return 0;
}