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

Реализация функции EXEC g++

28.11.2014, 05:02. Показов 2550. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, требуется помощь.
Суть такая необходима программа порождающая процессы exec с параметрами: -L -LP -V -VP то есть порождается 4 процесса в одной программе.
Вот сам код
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
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/errno.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
 
int prog1 (int argc, char *argv[], char *enpv[]);
int prog2 (int argc, char *argv[], char *enpv[]);
int prog3 (int argc, char *argv[], char *enpv[]);
int prog4 (int argc, char *argv[], char *enpv[]);
 
int main(int argc, char *argv[], char *enpv[])
{
 
 
    for (int i=0; i<argc; i++)
    {
        if(!strcmp(argv[i],"1")) printf("  1   poc   ");
            //prog1(argc, argv, enpv);
        if(!strcmp(argv[i],"2"))
            prog2(argc, argv, enpv);
        if(!strcmp(argv[i],"3"))
            prog3(argc, argv, enpv);
        if(!strcmp(argv[i],"4"))
            prog4(argc, argv, enpv);
    }
    return 0;
}
 
int prog1 (int argc, char *argv[], char *enpv[])
{
    int pid=fork(); 
    if (pid==0) execv("./forexecv", argv);
    else { printf("PID:%d\tPPID:%d\tIt's 1 process\n", getpid(), getppid()); wait(0);} 
    return 0;
}
 
int prog2 (int argc, char *argv[], char *enpv[])
{
    int pid=fork(); 
    if (pid==0) execl("./forexecl", NULL, NULL);
    else { printf("PID:%d\tPPID:%d\tIt's 2 process\n", getpid(), getppid()); wait(0);} 
    return 0;
}
 
int prog3 (int argc, char *argv[], char *enpv[])
{
    int pid=fork(); 
    if (pid==0) execvp("./forexecvp", argv);
    else { printf("PID:%d\tPPID:%d\tIt's 3 process\n", getpid(), getppid()); wait(0);} 
    return 0;
}
 
int prog4 (int argc, char *argv[], char *enpv[])
{
    int pid=fork(); 
    if (pid==0) execlp("./forexeclp", NULL, NULL);
    else { printf("PID:%d\tPPID:%d\tIt's 4 process\n", getpid(), getppid()); wait(0);} 
    return 0;
}
При компиляции я указываю цифры от 1 до 4 и по идее программа должна вывести 4 дочерних процесса и один родительский., здесь же почему то выводится 15 дочерних, причем у некоторых совпадают PID

HELP!! Кто что думает??
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2014, 05:02
Ответы с готовыми решениями:

Exe-файл, выводящий на экран строчку: «Хочу зачет!!!». Реализация функции запуска (EXEC) без использования библиотечных
Задание: Создайте exe-файл, выводящий на экран одну строчку: «Хочу зачет!!!». Реализуйте программу расшифровывающую заголовок данного...

QDialog вызов функции после exec()
Всем привет! Мне надо после того как окно диалога появилось вызвать код. А конкретно запустить поток. Используя перегрузку exec() код...

Ошибка in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc)
Traceback (most recent call last): File &quot;&lt;input&gt;&quot;, line 1, in &lt;module&gt; File &quot;C:\Program Files\JetBrains\PyCharm...

3
0 / 0 / 1
Регистрация: 18.09.2013
Сообщений: 47
11.02.2015, 16:21
по моему тут ошибка в цикле
у вас на каждой итерации стартует процесс - копия основного,
однако, после выполнения своей функции вы не завершаете процесс, а продолжаете его
return
в итоге у вас в цикле выполняются дочерние циклы...

попробуйте заменить return на exit(0)

Добавлено через 21 минуту
вообще инициализацию fork() правильнее проводить так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
switch(pid = fork())  
    {
        case -1:
            perror("fork");
            cout<<" - ошибка создания дочернего процесса!!!  \n";
            break;
        case 0:
            // код дочернего процесса
            break;
      default:
           // код родителя
}
0
0 / 0 / 1
Регистрация: 18.09.2013
Сообщений: 47
16.02.2015, 19: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
...
int main()
{
...
cout<<getpid()<< " работает основная программа! "<<endl;
switch(pid = vfork())                            
        {
        case -1:
        perror("fork");
        cout<<getpid()<<" !!! ошибка создания дочернего процесса!!!";
        break;
        case 0:
        cout<<getpid()<<" процесс создан, загружаем параметры и образ процесса"<<endl;
        execl("Programm.exe", "Programm.exe", param1, param2, NULL);
        cout<<getpid()<< " по идеи эта строка не должна выводиться вообще..."<<endl;
 
        break;
        default:
        cout<<getpid()<< " продолжение основной программы! = "<<endl;
        
        }
        
}
в откомпилированной программе Programm.exe вечный цикл!!! while(1),
по этому строка после запуска программы выполниться не должна, но ...
/1001 работает основная программа!
/1002 процесс создан, загружаем параметры и образ процесса!
/1002 по идеи эта строка не должна выводиться вообще...
/1002 продолжение основной программы! =
т.е. Programm.exe не выполнилась, а у основного процесса сменился PID(?)
если запустить отдельно Programm.exe param1 param2 - то Programm.exe работает!

подскажите, что не так?
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
17.02.2015, 22:16
Цитата Сообщение от Alez Посмотреть сообщение
подскажите, что не так?
Я понял так:
execl возвратил ошибку, а дочерний процесс не завершился через _exit(). В итоге, как говорит руководство по vfork() -
"behavior is undefined".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2015, 22:16
Помогаю со студенческими работами здесь

Реализация функции печати результатов предыдущей функции
Была написана программа с функцией, находящая результат выражения с аргументом, значения которого заданы параметром со значениями и шагом....

Реализация функции
Здравствуйте! Подскажите как можно реализовать подобное? Задана последовательность b(0)=1; b(1)=3; b(n)=b(n-1)*b(n-2); n&gt;1. ...

Реализация функции
Реализация функции y=\frac{x^2+x+3}{a-2}+\sqrt{\frac{(a-x)^5}{(2x-a)^3}}

Реализация функции last
Нужно вручную написать функцию last, и вот эти 2 списка из согласных нужно положить в локальную переменную, помоги пожалуйста (defun...

Реализация функции
Реализация функции y=\frac{\begin{vmatrix}x^5-\frac{\normal{z^5}}{\normal{5}}\end{vmatrix}}{\sqrt{x^2-9^{\,}}}


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru