Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
58 / 40 / 41
Регистрация: 26.09.2013
Сообщений: 347
Записей в блоге: 1

Подскажите как сделать так, чтобы после порождения двух дочерних процессов, процесс-отец завершался

10.03.2014, 15:30. Показов 2059. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа в которой процесс-отец, порождает два дочерних процесса. Подскажите как сделать так, чтобы после порождения двух дочерних процессов, процесс-отец не ждал, а завершался.
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 <unistd.h>
#include <sys/types.h>
#include <stdio.h>
 
extern char **environ;
int main() {
    // 1
    FILE *f;
    if ((f = fopen("file", "w")) == NULL) {
        perror("Error");
        return 1;
    }
 
    fprintf(f, "Some small text\n");
    fclose(f);
    // 2
    pid_t pid1, pid2;
    int status1, status2, i;
    switch (pid1 = fork()) {
    case -1:
        perror("Error");
        return 1;
    case 0:
        // 3
        environ[0] = "SHELL=/bin/sh";
        f = fopen("file", "a");
        for (i = 0; i < 40; i++) {
            if (environ[i] == NULL) break;
            fprintf(f, "%s\n", environ[i]);
        }
        fclose(f);
        break;
    default:
        switch (pid2 = fork()) {
        case -1:
            perror("Error");
            return 1;
        case 0:
            // 3
            environ[0] = "SHELL=/bin/zsh";
            f = fopen("file", "a");
                    for (i = 0; i < 40; i++) {
                            if (environ[i] == NULL) break;
                            fprintf(f, "%s\n", environ[i]);
                    }
                    fclose(f);
            break;
        default:
            // 4
            waitpid(pid1, &status1, 0);
            waitpid(pid2, &status2, 0);
            if ((f = fopen("file", "r")) == NULL) {
                perror("Error");
                return 1;
            }
            char str[128];
            while (!feof(f)) {
                if (fgets(str, 126, f)) {
                    printf("%s", str);
                }
            }
            execl("/bin/sh", "sh", "-c", "wc -w < file", NULL);
            perror("Error"); 
        }
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.03.2014, 15:30
Ответы с готовыми решениями:

Как сделать так чтобы при открытие дочерних форм (через MainMenu) появлялась только одна вкладка TabSet
Такая ситуация, существует главная форма и дочерние(MDI), как сделать так чтобы при открытие дочерних форм (через MainMenu) появлялась...

Процесс порождает 7 дочерних процессов-потомков
Процесс порождает 7 дочерних процессов-потомков. Процессы выводят сообщение о старте, выполняют sleep на случайное количество секунд (от 3...

OC Windows, как сделать так, чтобы при запуске процесса, он убивался, если уже такой процесс есть?
Ну то есть экзешник должен выполняться в оси в единственном экземпляре, как сие реализовать ГРАМОТНО? По-простому-то я сделаю. Я в крайнем...

2
 Аватар для Dizark
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 84
13.03.2014, 22:02
C
1
2
            waitpid(pid1, &status1, 0);
            waitpid(pid2, &status2, 0);
Эти команды заставляют родителя ждать, пока от порожденных им процессов не придут сигналы SIGCHLD. Точнее сначала ждет от первого, потом от второго.

Соответственно - убери их и родитель не будет ждать завершения.
0
0 / 0 / 1
Регистрация: 10.09.2012
Сообщений: 10
21.03.2014, 14:36
Пример с комментами как сделать демона, то есть отвязаться от родителя и отправится в личное плаванье:

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
        // Ответвляемся от родительского процесса
        pid = fork();
        if (pid < 0) {
            exit(EXIT_FAILURE);
        }
        /* Если с PID'ом все получилось, то родительский процесс можно завершить. */
        if (pid > 0) {
            exit(EXIT_SUCCESS);
        }
        /* Изменяем файловую маску */
        umask(0);
 
        /* Здесь можно открывать любые журналы */
 
        /* Создание нового SID для дочернего процесса */
        sid = setsid();
        if (sid < 0) {
            exit(EXIT_FAILURE);
        }
        /* Изменяем текущий рабочий каталог */
        if ((chdir("/")) < 0) {
            /* Журналируем любой сбой */
            exit(EXIT_FAILURE);
        }
 
        /* Закрываем стандартные файловые дескрипторы */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
Пример 100% рабочий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2014, 14:36
Помогаю со студенческими работами здесь

RegEx, нужно чтобы после первого вхождения </form> поиск завершался
Раньше не связывался с этим, после 2х часов гугления проб и чтения не смог составить простое выражение xD должно начинаться на ...

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

Как сделать так, чтобы условие начало работать?Подскажите,пожалуйста
Здравствуйте. Прошу,подскажите,пожалуйста, ступор уже. Вот прога: for(n=1;n&lt;=100;n++) do { P0=1/(exp(r,n));...

подскажите как сделать так чтобы браузерская страничка не обновлялась в дельфи
предварительно создал index файл,который выполняет какие то действия(просто переходит по ссылкам) Создаю проект,кидаю на форму...

Как сделать так, чтобы приоритет двух потоков задавал пользователь?
Помогите как сделать так, чтобы приоритет двух потоков задавал пользователь вот программа unit Unit1; interface uses ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
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 и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru