Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 13

Execl из форкнутого потомка

26.05.2009, 12:54. Показов 3038. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго, есть код, который должен создавать потомка процесса и из этого потомка вызывать стороннюю программу в данном случае sort, имя сортируемого файла и доп ключ принимаем из консоли, строка запска execl (SHELL, argv[0], argv[1], NULL); в потомке. Компилируется без ошибок, при выполнении программы не доходит до этой сторки execl (SHELL, argv[0], argv[1], NULL);

Tesla:# ./orderfile -b orderfile.c


*******PARENT*******
PARENT: PID - 12927
PARENT: PID my CHILD 12928
PARENT: i wait to exit()...
PARENT: code exit CHILD:0
PARENT: Exit!


*******CHILD*******
CHILD: PID - 12928
CHILD: PID my PARENT - 1
Tesla:#

из-за чего, в чём проблема?

сам код:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stddef.h>
 
#define SHELL "sort"
 
 
int main(int argc, char* argv[4]) 
{ 
 
 
//data type 
pid_t pid; 
int rv; 
 
 
pid=fork();
 
 
if(pid == -1)
{
perror("fork"); 
exit(1); 
}
 
 
 
//this process PARENT
if(pid != 0) 
{
printf("\n\n*******PARENT*******\n"); 
printf(" PARENT: PID - %d\n", getpid()); 
printf(" PARENT: PID my CHILD %d\n", pid); 
printf(" PARENT: i wait to exit()...\n"); 
 
 
// wait(); //!!?!?!??!??!?!??!?!?! 
 
printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
printf(" PARENT: Exit!\n"); 
 
}
 
 
 
 
//this process CHILD
if(pid == 0) 
{
 
printf("\n\n*******CHILD*******\n"); 
printf(" CHILD: PID - %d\n", getpid()); 
printf(" CHILD: PID my PARENT - %d\n",getppid()); 
 
printf("%s,---%s",argv[0],argv[1]);
 
 
execl (SHELL, argv[0], argv[1], NULL);
_exit (EXIT_FAILURE); //without updating flow
}
 
 
}


спасибо за внимание.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2009, 12:54
Ответы с готовыми решениями:

Вызов специфических для потомка функций, не зная класса потомка
Доброго времени суток. Когда-то давно делал работу в C#, а сейчас захотел повторить то же в C++. Затык вот в чем. был у меня...

Вопрос по execl
мне нужно выполнить вот это egrep -o &quot;\b\w{argv}\b&quot; argv для это #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt; int main(int argc,char*...

Execl,код возврата
У меня программа, которая читает из текстового файла текст(команды) и затем выполняет эти командs. Вообще,она мудрёнее, но меня интересует...

8
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
26.05.2009, 14:18
Вот я поправил чайлд процесс. Уверен, ты разберешься, что к чему:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
//this process CHILD
if(pid == 0)
{
 
printf("\n\n*******CHILD*******\n");
printf(" CHILD: PID - %d\n", getpid());
printf(" CHILD: PID my PARENT - %d\n",getppid());
 
printf("ARG0 - %s, ARG1 - %s",argv[0],argv[1]);
 
execl ("/usr/bin/sort", SHELL, argv[1], NULL);
_exit (EXIT_FAILURE); //without updating flow
}
Заметь в него я передаю argv[1], так как argv[0] содержит имя запускаемого приложения. На фига оно мне. То есть, параметром я указываю имя какого-нибудь файла. Например:
[Vourhey is in ~/projs/C]$ ./a.out mylog


*******CHILD*******
CHILD: PID - 31119
CHILD: PID my PARENT - 31118
ARG0 - ./a.out, ARG1 - mylog







++++++++++++++++++++++++++++++
__________END____________
__________END____________
Evaltext:
Evaltext:
Evaltext:
Evaltext:
Filename:one.pl
Filename:one.pl
Filename:one.pm
Filename:one.pm
Line: 0
Line: 0
Line: 11
Line: 6
Package:main
Package:main
Package:main
Package:main
___________START_____________
___________START_____________
Subeval)
Sub:main::init
Sub:main::INIT
Sub:main::second


*******PARENT*******
PARENT: PID - 31118
PARENT: PID my CHILD 31119
PARENT: i wait to exit()...
PARENT: code exit CHILD:102
PARENT: Exit!
Содержимое файла переданного cli аргументом сортируется.
0
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 13
26.05.2009, 15:12  [ТС]
Благодарствую знающий человек.

подправил код,

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//NAME PROG orderfile.c
 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stddef.h>
 
#define PATH "/usr/bin/sort"
#define SORT "sort"
 
int main(int argc, char* argv[]) 
{ 
 
 
//data type 
  pid_t pid; 
  int rv; 
 
 
 
//create new process
  pid=fork();
 
 
  if(pid == -1)
  {
      perror("fork");  
      exit(1);  
  }
 
 
 
//this process PARENT
  if(pid != 0) 
  {
       printf("\n\n*******PARENT*******\n"); 
       printf(" PARENT: PID - %d\n", getpid()); 
       printf(" PARENT: PID my CHILD %d\n", pid); 
       printf(" PARENT: i wait to exit()...\n"); 
 
//       wait(); //!!?!?!??!??!?!??!?!?! 
       printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
       printf(" PARENT: Exit!\n"); 
   
  }
 
 
//this process CHILD
  if(pid == 0) 
  {
       printf("\n\n*******CHILD*******\n"); 
       printf(" CHILD: PID - %d\n", getpid()); 
       printf(" CHILD: PID my PARENT - %d\n",getppid()); 
       
       printf("ARG0 - %s, ARG1 - %s ",argv[0],argv[1]);
       printf("\n@@@@@@@Print file SORT:@@@@@@@\n");
 
       execl (PATH, SORT, argv[1], argv[2], NULL);
       _exit (EXIT_FAILURE); //without updating flow
  }
 
 
}
начитался манов
http://www.opennet.ru/docs/RUS/glibc/glibc-23.html
http://www.opennet.ru/docs/RUS/ipcbook/node7.html
man fork
man exec

теперь хотелось бы изложить ход понимания происходящего, верно ли всё осознаю

1) pid=fork()
породил в памяти новый процесс который идентичен текущему "запущеной программе orderfile.c" отличается лишь PID. операционная система переключилась на вновь созданый процесс во вновь созданом "дочернем процессе" был отработан if(pid == 0) ибо как гласит man дочерний процесс в качестве аргумента дескриптора pid_t получает 0.
После чего управление переместилось в процесс родитея где был получе pid поломка и отработало условие if(pid != 0).
всё ли верно изложил? подправьте дополните, спасибо.




Теперь хочу организовать механизм ожидания завершения работы потомка, в манах обнаружил что это можно реализовать используя функцию wait()

C
1
2
3
4
5
6
7
8
9
10
11
12
  if(pid != 0) 
  {
       printf("\n\n*******PARENT*******\n"); 
       printf(" PARENT: PID - %d\n", getpid()); 
       printf(" PARENT: PID my CHILD %d\n", pid); 
       printf(" PARENT: i wait to exit()...\n"); 
 
//       wait(); //!!?!?!??!??!?!??!?!?!!!??!??!?????
       printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
       printf(" PARENT: Exit!\n"); 
   
  }
котороя будет ждать возврата кода от потомка и посредством макроса WEXITSTATUS вывести его результат
но при использовании даной фции компилер ругается
orderfile.c:42: error: too few arguments to function ‘wait’
мало этой фции видите ли параметров, что за параметры? почему и зачем?

по поводу wait нет чёткого понимания. подскажите.
спасибо.
0
 Аватар для Mecid
684 / 233 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
26.05.2009, 16:24
C
1
2
int status;
wait(&status);
0
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 13
26.05.2009, 17:00  [ТС]
а по изложеному пониманию что?
0
 Аватар для Mecid
684 / 233 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
26.05.2009, 17:34
У функции вэйт 1 параметр указатель на инт туда записывается число секунд которых стоял поток
0
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 13
26.05.2009, 21:25  [ТС]
а код возврата потомка "как он завершился" как можно получить?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.05.2009, 21:58
Цитата Сообщение от imax Посмотреть сообщение
1) pid=fork()
породил в памяти новый процесс который идентичен текущему "запущеной программе orderfile.c" отличается лишь PID. операционная система переключилась на вновь созданый процесс во вновь созданом "дочернем процессе" был отработан if(pid == 0) ибо как гласит man дочерний процесс в качестве аргумента дескриптора pid_t получает 0.
После чего управление переместилось в процесс родитея где был получе pid поломка и отработало условие if(pid != 0).
всё ли верно изложил? подправьте дополните, спасибо.
При fork'е у тебя создаётся два процесса, каждый из которых живёт своей независимой жизнью. Внутри процедуры fork управление передаётся в ядро ОС. После чего ядро создаст ещё один процесс, который с точки зрения ядра ничем не отличается от любого другого процесса (разве что есть информация, что первый процесс является родителем второго). После отбработки ядром fork'а грубо говоря, не известно, который из процессов будет поставлен на исполнение. Т.е. у тебя нет никакой гарантии, что родительский процесс прожолжит иполнение раньше дочернего - тут зависит от того, как встанут звёзды

Добавлено через 4 минуты 59 секунд
Цитата Сообщение от imax Посмотреть сообщение
а код возврата потомка "как он завершился" как можно получить?
Через упомянутый тобою WEXITSTATUS

C
1
2
3
4
5
6
int status, res;
wait (&status); // <-- здесь болтаемся внутри wait'а до тех пор, пока не завершит работу потомок
if (WIFEXITED (status))
  res = WEXITSTATUS (status); // <-- код возврата
else
  // Процесс втсал раком, словил сигнал или ещё какая ж$па случилась
Более подробно в man'е - http://linux.die.net/man/3/wait
1
0 / 0 / 0
Регистрация: 01.05.2009
Сообщений: 13
27.05.2009, 12:22  [ТС]
Спасибо Вам
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2009, 12:22
Помогаю со студенческими работами здесь

execl не передает параметры
//1 execl(&quot;/home/a/os_3/copy_file/bin/Debug/copy_file&quot;, // &quot;copy_file&quot; запускает sendfile(out,in) &quot;home/a/C++/11/file_a&quot;, ...

Реализация execvp и execlp через execl и execv
Есть задача: Написать эквиваленты execvp и execlp, используя вызовы execl и execv. Параметры этих процедур должны состоять из списка...

Передать параметр в дочерний процесс через execl()
Создаю дочерний процесс . В него нужно передать число , которое водится в родительском процессе . Вот код : main.c ...

Передать параметр в дочерний процесс через execl()
Немного не по теме .. но может кто знает , как это сделать Создаю дочерний процесс . В него нужно передать число , которое вводится в...

запуск нового процуса спомошью execl , передача сообшений не работает
Доброе время суток Помогите пожалуйста понять в чем проблема ниже приведен код вот главная программа #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru