Компилировать источник C в процессе - PullRequest
0 голосов
/ 13 апреля 2011

Я хочу скомпилировать исходный код 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 (..) находится?

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

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

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

1 голос
/ 13 апреля 2011
#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;
}
...