Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.

execl, execle, execlp, execv, execve, execvp, execvpe

 
 Функция            Функции, загружающие и запускающие другие программы.
 
 
 
 Синтаксис          int execl(char * pathname, char * arg0, arg1, ...,
 
                    argn, NULL);
 
                    int execle(char * pathname, char * arg0, arg1,
 
                    ..., argn, NULL, char ** envp);
 
                    int execlp(char * pathname, char * arg0, arg1,
 
                    ..., argn, NULL);
 
                    int execlpe(char *  pathname, char * arg0, arg1,
 
                    ..., argn, NULL, char ** envp);
 
                    int execv(char * pathname, char * argv[]);
 
                    int execve(char * pathname, char * argv[],
 
                    char ** envp);
 
                    int execvp(char * pathname, char * argv[]);
 
                    int execvpe(char * pathname, char * argv[],
 
                    char ** envp);
 
 
 
 Файл, содержащий   process.h
 
 прототип
 
 
 
 Описание           Семейство функций  exec...  загружает  и  запускает
 
                    другие    программы,   известные   как   "дочерние"
 
                    процессы.  Если вызов функции  exec...  завершается
 
                    успешно,   "дочерний"   процесс   накладывается  на
 
                    "родительский"   процесс;   причем   должно    быть
 
                    достаточно   памяти   для   загрузки  и  выполнения
 
                    "дочернего" процесса.
 
 
 
                    pathname -  это  имя  файла вызываемого "дочернего"
 
                    процесса.   Функции   exec...   производят    поиск
 
                    pathname,  пользуясь стандартным алгоритмом системы
 
                    DOS:
 
 
 
                    - Нет расширения имени файла и нет точки;  в  таком
 
                      случае  производится  поиск  точного имени файла,
 
                      если такое имя не найдено, добавляется расширение
 
                      .com и поиск продолжается. Если и такого файла не
 
                      найдено, то добавляется расширение .exe  и  поиск
 
                      выполняется последний раз.
 
 
 
                    - Расширение   имени  присутствует  -  производится
 
                      поиск по точному имени файла;
 
 
 
                    Суффиксы l, v, p и e, добавляемые к имени семейства
 
                    exec...   обозначают,   что  данная  функция  будет
 
                    работать с некоторыми особенностями:
 
 
 
                    p - определяет, что функция будет искать "дочернюю"
 
                        программу     в    директориях,    определяемых
 
                        переменной среды DOS PATH. Без суффикса p поиск
 
                        будет  производиться только в рабочем каталоге.
 
                        Если параметр path  не  содержит  маршрута,  то
 
                        поиск  производится  в  текущей  директории,  а
 
                        затем  по  маршрутaм,  определяемым  переменной
 
                        окружения PATH.
 
 
 
                    l - показывает, что адресные указатели (arg0, arg1,
 
                        ..., argn) передаются, как отдельные аргументы.
 
                        Обычно суффикс l употребляется, когда число пере-
 
                        даваемых аргументов заранее вам известно.
 
 
 
                    v - показывает,  что  адресные  указатели  (arg[0],
 
                        arg[1],...arg[n])    передаются,   как   массив
 
                        указателей.  Обычно,  суффикс  v  используется,
 
                        когда передаeтся переменное число аргументов.
 
 
 
                    e - показывает, что "дочернему" процессу может быть
 
                        передан  аргумент   envp,   который   позволяет
 
                        выбирать   среду   "дочернего"   процесса.  Без
 
                        суффикса e "дочерний" процесс унаследует  среду
 
                        "родительского" процесса.
 
 
 
                    Каждая функция семейства exec...  должна иметь один
 
                    из двух суффиксов,  определяющих аргументы (либо l,
 
                    либо  v).  Суффиксы  определения  маршрута  доступа
 
                    (PATH) и унаследования операционной среды (p  и  e)
 
                    являются необязательными.
 
 
 
                    Например:
 
 
 
                    - execl  -  представляет  собой  функцию  семейства
 
                      exec...,  которая передает раздельные  аргументы,
 
                      ищет "дочерний" процесс только в рабочем каталоге
 
                      и  передает  "родительскую"   среду   "дочернему"
 
                      процессу.
 
 
 
                    - execvpe   представляет  собой  функцию  семейства
 
                      exec...,  которая  передает   массив   указателей
 
                      аргументов, подсоединяет маршрут доступа PATH для
 
                      поиска "дочернего" процесса и применяет  аргумент
 
                      envp для выбора среды "дочернего" процесса.
 
 
 
                    Функция семейства    exec...    должна   передавать
 
                    "дочернему" процессу хотя бы  один  аргумент  (arg0
 
                    или   argv[0]).  Данный  аргумент,  по  соглашению,
 
                    представляет собой копию  pathname.  (Использование
 
                    других  значений  для  нулевого  аргумента не будет
 
                    ошибкой).
 
 
 
                    В системах DOS версий 3.X "дочерний" процесс  может
 
                    получить аргумент pathname;  в более ранних версиях
 
                    "дочерний" процесс не может  использовать  значение
 
                    нулевого аргумента (arg0 или argn[0]).
 
 
 
                    При использовании суффикса l, арг0 обычно указывает
 
                    на pathname,  а arg1, ..., argn указывают на строки
 
                    символов,    которые    формируют    новый   список
 
                    аргументов.  Завершающий NULL,  следующий за  argn,
 
                    обозначает конец списка.
 
 
 
                    При использовании  суффикса  e  список  назначенной
 
                    среды передается с помощью аргумента  envp.  Данный
 
                    аргумент является массивом из элементов типа char*.
 
                    Каждый элемент указывает  на  символьную  строку  с
 
                    нулевым окончанием формы:
 
 
 
                           envvar = value , где
 
 
 
                    envvar -  имя  переменной среды,  а value- значение
 
                    символьной  строки,  которая  присваивается  каждой
 
                    переменной  envvar.  Последним  элементом в массиве
 
                    envp[] является адресный нуль NULL. Когда значением
 
                    envp[0] является NULL, "дочерний" процесс наследует
 
                    назначения среды "родительского" процесса.
 
 
 
                    Общая длина  arg0+   arg1+...+argn   (или   arg[0]+
 
                    arg[1]+...+arg[n]),  включая  пробелы,  разделяющие
 
                    аргументы,  должна быть меньше 128 байтов.  Нулевые
 
                    окончания не считаются.
 
 
 
                    При вызове  функции  exec...  любые  открытые файлы
 
                    остаются открытыми и в "дочернем" процессе.
 
 
 
 Возвращаемое       При успешном завершении функции exec... не возвра-
 
 значение           щают никакого значения. При возникновении ошибки
 
                    функции exec...   возвращают   значение    -1,    а
 
                    глобальная   переменная   errno  получает  одно  из
 
                    следующих значений:
 
 
 
                    E2BIG  - Слишком длинный список аргументов.
 
                    EACCES - Отказ доступа.
 
                    EMFILE - Слишком много открытых файлов.
 
                    ENOENT - Маршрут доступа (PATH) или имя файла не
 
                             найдены.
 
                    ENOEXEC - Ошибка формата EXEC.
 
                    ENOMEM  - Не хватает памяти.
 
 
 
 Переносимость      exec... уникальна для DOS.
 
 
 
 Смотрите также:    abort, atexit,_exit, exit, _fpreset, searchpath,
 
                    spawn..., system.
 
 
 
 Пример:
 
 
 
 #include <stdio.h>
 
 #include <stdlib.h>
 
 
 
 main(int argc, char * argv[])
 
 {
 
    int i;
 
    printf("Запущен дочерний процесс ...\n");
 
    printf("%s\n",getenv("PATH"));
 
    for (i=0; i<argc; i++)
 
       printf("argv[%d]: %s\n", 1, argv[i]);
 
 }
 
 
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<dos.h>
 
 
 
 int main(int argc,char *argv[])
 
 {
 
     int loop;
 
     printf("%s работает...\n\n",argv[0]);
 
     if(argc == 1)  /* есть ли еще аргументы */
 
     {
 
        printf("%s запускает сама себя опять...\n",argv[0]);
 
        execl(argv[0],argv[0],"ONE","TWO","THREE",NULL);
 
        perror("EXEC:");
 
        exit(1);
 
     }
 
     printf("%s вызвана с аргументами:\n",argv[0]);
 
     for(loop = 1;loop<=argc;loop++)
 
        puts(argv[loop]);
 
     return 0;
 
 }
 
 
 
 
 
 #include<process.h>
 
 #include<stdlib.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<dos.h>
 
 
 
 int main(int argc,char *argv[])
 
 {
 
     int loop;
 
     char *new_env[] = {"TELYING",NULL};
 
 
 
     printf("%s работает...\n\n",argv[0]);
 
     if(argc == 1)  /* есть ли еще аргументы */
 
     {
 
        printf("%s запускает сама себя опять...\n",argv[0]);
 
        execle(argv[0],argv[0],"ONE","TWO","THREE",NULL,new_env);
 
        perror("EXEC:");
 
        exit(1);
 
     }
 
     printf("%s вызвана с аргументами:\n",argv[0]);
 
     for(loop = 1;loop<=argc;loop++)
 
        puts(argv[loop]);
 
 
 
     /* напечатать первый параметр среды */
 
     printf("env[0] = %s\n",env[0]);
 
     return 0;
 
 }
 
 
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<dos.h>
 
 
 
 int main(int argc,char *argv[])
 
 {
 
     int loop;
 
     printf("%s работает...\n\n",argv[0]);
 
     if(argc == 1)  /* есть ли еще аргументы */
 
     {
 
        printf("%s запускает сама себя опять...\n",argv[0]);
 
        execlp(argv[0],argv[0],"ONE","TWO","THREE",NULL);
 
        perror("EXEC:");
 
        exit(1);
 
     }
 
     printf("%s вызвана с аргументами:\n",argv[0]);
 
     for(loop = 1;loop<=argc;loop++)
 
        puts(argv[loop]);
 
     return 0;
 
 }
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<stdlib.h>
 
 #include<string.h>
 
 #include<dos.h>
 
 
 
 void main(int argc,char *argv[],char **envp)
 
 {
 
     printf("Запуск CHILD с arg1, arg2 ...\n");
 
     execlpe("CHILD.EXE","CHILD.EXE","arg1","arg2",NULL,envp);
 
     perror("Ошибка EXEC");
 
     exit(1);
 
 }
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<stdlib.h>
 
 #include<string.h>
 
 #include<dos.h>
 
 
 
 void main(int argc,char **argv)
 
 {
 
     printf("Запуск CHILD с arg1, arg2 ...\n");
 
     execv("CHILD.EXE",argv);
 
     perror("Ошибка EXEC");
 
     exit(1);
 
 }
 
 
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<stdlib.h>
 
 #include<string.h>
 
 #include<dos.h>
 
 
 
 void main(int argc,char **argv,char **envp)
 
 {
 
     printf("Запуск CHILD с arg1, arg2 ...\n");
 
     execve("CHILD.EXE",argv,envp);
 
     perror("Ошибка EXEC");
 
     exit(1);
 
 }
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<stdlib.h>
 
 #include<string.h>
 
 #include<dos.h>
 
 
 
 void main(int argc,char **argv)
 
 {
 
     printf("Запуск CHILD с arg1, arg2 ...\n");
 
     execvp("CHILD.EXE",argv);
 
     perror("Ошибка EXEC");
 
     exit(1);
 
 }
 
 
 
 #include<process.h>
 
 #include<stdio.h>
 
 #include<errno.h>
 
 #include<stdlib.h>
 
 #include<string.h>
 
 #include<dos.h>
 
 
 
 int main(int argc,char **argv,char **envp)
 
 {
 
     printf("Запуск CHILD с arg1, arg2 ...\n");
 
     execvpe("CHILD.EXE",argv,envp);
 
     perror("Ошибка EXEC");
 
     exit(1);
 
 }

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS