Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ Семейство функций exec

Автор: shplint Вторник, 19 Февраля 2008, 18:41

Подскажите кто в этом понимает для чего эти функции нужны, как их использовать(желательно на простом и понятном для чайников языке) и примеры небольших программок с использованием этих функций, чтобы лучше понять все это. В нэте смотрел, но че то непонятно написано смотрел еще и справку MSDN в ней тоже непонятно все на английском языке, а примеры слишком сложные

Автор: Админ Вторник, 19 Февраля 2008, 19:16

Цитата(shplint @ Сегодня, 19:41)
для чего эти функции нужны

Можешь яснее спрашивать, какие именно функции? Что за "Семейство функций exec", у нас, тут, это самое, ну короче, штатные телепаты ушли в отпуск, и поэтому очень сложно догадываться о чем ты думаешь.
Разновидностей функций c именем EXEC может быть очень и очень много, например во многих классах (как стандартных, так и самописных) есть такие функции, выполняющие различные действия. На каком хоть языке программирования пишешь? О чем речь идет? C#, С++, PHP, Java, WinAPI, блокнот с карандашом, бумага с пером, забор и кусок мела?

Автор: shplint Вторник, 19 Февраля 2008, 23:24

Я имею виду функции (execl,execle,execlp...еще есть какие-то) в языке С. Чем они различаются кроме формата объявления, как этими функциями пользоваться, примеры программ с использованием их...теперь вроде понятно написал.

Автор: Админ Среда, 20 Февраля 2008, 10:11

http://www.codenet.ru/progr/cpp/spr/084.php

Автор: shplint Среда, 20 Февраля 2008, 11:19

Теорию эту я уже видел, а вот примеров еще этих не видел. Но они мне че то не очень понятны.

int main(int argc,char *argv[])
{
int loop;
printf("%s работает...nn",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;
} Я непонимаю в execl(argv[0],argv[0],"ONE","TWO","THREE",NULL) то, что стоит в скобочках. argv[0]-путь к пограмме, а остальное зачем "ONE","TWO","THREE",NULL и непонятно, что делает эта функция

Автор: shplint Среда, 20 Февраля 2008, 11:26

Еще непонятно вот что в примере(см. ниже) строчка execvp("CHILD.EXE",argv);void main(int argc,char **argv)
зачем в ф. main применено указатель на указателе
#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);
}

Автор: Квазимодо Четверг, 21 Февраля 2008, 10:18

shplint, ты можешь объявлять функцию main так:

Код
int main(int argc, char **argv)
,
или так:
Код
int main(int argc, char *argv[])
,
или даже так:
Код
or int main(int argc, char argv[][])
.
В любом случае, argv - это массив строк, которые сами, в свою очередь, являются указателями на массив символов (char*). Оператор индекса массива ([]) возвращает значение по указателю: Array[Index] - это то же, что *((Array)+Index). (Здесь Index имеет тип int). Так что в первом случае (char **argv) ты можешь обрабатывать параметры командной строки так:
Код
while (*argv)
 // здесь что-то делаешь со строкой *argv
 argv++;
}
, а во втором (char *argv[]) так:[CODE]for (i = 0; argv[i] != NULL; i++) {
// здесь что-то делаешь со строкой argv[i]
}

Автор: shplint Пятница, 22 Февраля 2008, 0:14

Квазимодо, вррбще то я не об этом спрашивал...

Автор: Квазимодо Пятница, 22 Февраля 2008, 9:23

Ну, я увидел вот это:

Цитата
Еще непонятно вот что в примере(см. ниже) строчка execvp("CHILD.EXE",argv);void main(int argc,char **argv)
зачем в ф. main применено указатель на указателе

и подумал, что ты спрашиваешь, почему применен указатель на указатель, а не указатель на массив, как обычно. Тогда объясни, пожалуйста, о чем ты спрашивал.

Автор: shplint Пятница, 22 Февраля 2008, 10:13

Про это тоже конечно, но че то я несовсем уловил то что написал, да и ваще че то я не могу вкурить эти exec.
for (i = 0; i<argc; i++) {
// здесь что-то делаешь со строкой argv[i]
}Я думаю что вот так эта строчка правильная будет, можешь простым и понятным языком объяснить мне тупому эти exec?

Автор: Админ Пятница, 22 Февраля 2008, 11:42

shplint, может стоит все-таки сесть и самому попробовать написать что-нибудь с использованием этих функций, чтобы воочию увидеть как они работают. Не понятно, что тебе непонятно в этих функциях? smile.gif По-моему все вполне очевидно.

Автор: Квазимодо Пятница, 22 Февраля 2008, 12:35

Админ, IMHO, на твой вопрос:

Цитата
Не понятно, что тебе непонятно в этих функциях?
, ответ такой: им преподают C++ примерно как заочникам, "галопом по Европам". Не вдаваясь в теорию (хотя бы про указатели, объявления прототипов функций и прочее), сразу требуют практику (судя по соседней теме, очень ускоренно - сейчас относительно простые примеры, а через полгода - уже обмен сообщениями по TCP/IP). Ко мне недавно двое программистов-второкурсников (с дневного!) приходили с заданиями - пока тоже под DOS (на ASM, файловые функции, тоже все сжато до безобразия, даже задачу препод внятно не поставил), а до чего через полгода дойдут - кто его знает...
shplint, ты недавно спрашивал:
Цитата
Я непонимаю в execl(argv[0],argv[0],"ONE","TWO","THREE",NULL) то, что стоит в скобочках. argv[0]-путь к пограмме, а остальное зачем "ONE","TWO","THREE",NULL
. Так вот, эти "ONE", "TWO", "THREE" взяты только для примера - это аргументы, которые вызывающая программа передает вызываемой через командную строку. В примере выбрана функция execl, т.е. тот вариант функции exec, который требует передачи параметров командной строки списком. Если ты посмотришь объявление функции execl в инклюде process.h, то увидишь там многоточие в конце, т.е. количество параметров заранее неизвестно. Поэтому и нужен NULL в конце, чтобы функция execl могла определить, сколько всего параметров.
Если бы в примере была функция execv, то ты явно определял бы массив из указателей char* и заводил бы в него указатели на строки argv[0] и остальные параметры.

Автор: shplint Пятница, 22 Февраля 2008, 21:10

Еще такой вопросик: написал программу по лабораторке, но у меня не производится действий команды dir. Программа должна после указания пути к программе, после которого вводится пробел, и ключа выполнить команду dir.См. алгоритм:
#include "stdafx.h"
#include <conio.h>
#include <string.h>
#include<stdio.h>
#include<process.h>

int main(int argc,char *argv[],char *env[])
{
if (argc==1)
{
printf("\n\n\t\tTechnical support Mahonin M.S.");
printf("\n\t\t\t e-mail:shplint2@yandex.ru");
printf("\n\t\t\t icq:3302883");
return 0;
}
if (strncmp(argv[1],"-/?",3)==NULL)
{
printf("\n%s",argv[0]);
printf("\nAll right belong autor this programm ");

return 0;
}
if (strncmp(argv[1],"-dir",4)==NULL)
{
execl("dir.exe","dir.exe",NULL);
return 0;



}

}
Укажите на мои ошибки, пожалуйста. Постановка задачи думаю понятна.

Автор: shplint Суббота, 23 Февраля 2008, 17:11

Постарайтесь ответить на последний пост побыстрее...

Автор: shplint Понедельник, 25 Февраля 2008, 16:42

Не может быть такого что никто не знает, не поленитесь ответить на мой пустячковый вопрос

Автор: Квазимодо Вторник, 26 Февраля 2008, 11:12

shplint, нет такого файла dir.exe, а есть командный процессор (cmd.exe), и в него через командную строку передается твой dir. Поэтому строку

Код
execl("dir.exe","dir.exe",NULL);
придется заменить на
Код
execlp("cmd.exe","cmd.exe","/c","dir",NULL);
В данном случае execlp используется, чтобы искать cmd.exe не только в текущей директории, но и в тех, которые прописаны в переменной PATH (в том числе в системной, где он на самом деле и есть).

Автор: Барэль Вторник, 26 Февраля 2008, 11:40

shplint, я понимаю что не терпится увидеть ответ, но в выходные достаточно большое количество народа занимается тем что отдыхает. В т.ч. от компьютера. Не стоит подпрыгивать от нетерпения и постить на форум фразы "ну когда уже"

Автор: shplint Вторник, 26 Февраля 2008, 18:36

execlp("cmd.exe","cmd.exe","/c","dir",NULL);
cmd.exe-это путь
cmd.exe,/c;dir-это аргументы, а зачем мы берем каждый из них?

Автор: Админ Вторник, 26 Февраля 2008, 18:42

shplint, а трудно самому выполнить Пуск -> Выполнить -> cmd /c dir -> OK и посмотреть что получится.
А если непонятно, то всегда есть справка. Когда же вы научитесь пользоваться документацией в электронном и печатном виде, ну в самом деле? Банальное "cmd /?" выполниться несудьба. Там же по-русски написано все.

Учитесь, учитесь дорогой пользоваться доступной информацией. А еще учитесь думать и пробовать сами. Никто за вас ничто делать просто-так не будет - закон жизни smile.gif

Автор: shplint Вторник, 26 Февраля 2008, 18:59

Я еще только учусь и вполне естественно что у меня возникают вопросы, вопросы не возникаю только у тех кто ничего не делают, надеюсь ты с этим согласен.
И еще вопрос, не понятно как например показать содержимое не диска с, а вполне определенной папки?
execlp("cmd.exe","cmd.exe","/c","dir","c:\command\programm1",NULL); если в коммандной строке ввести cmd.exe /c dir c:\command\programm1 содержимое папки показывается. А если через путь к программе то нет, почему так?

Автор: Квазимодо Среда, 27 Февраля 2008, 9:38

Попробуй так:

Код
execlp("cmd.exe","cmd.exe","/c","dir","c:\\command\\programm1",NULL);
(в путях по два обратных слэша).

Автор: shplint Среда, 27 Февраля 2008, 9:48

Все равно не хочет работать, даже с двумя обратными слэшами

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)