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

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

10.03.2014, 15:30. Показов 2052. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru