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

fork() процессы

10.11.2020, 15:31. Показов 1388. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу которая вызывает функцию fork() 3 раза, например в цикле(петле) и выпишите указанные выше идентификаторы для всех дочерних процессов. На основании результата выписать "генеалогическое дерево" создаваемых процессов. Сколько создаеться процессов и почему?

Компилятор выводит ошибку program1_2.c: In function ‘tree’:
program1_2.c:60:19: warning: ‘sprintf’ may write a terminating nul past the end of the destination [-Wformat-overflow=]
60 | sprintf(cmd, "%s%d", pstree, pid);
| ^
program1_2.c:60:1: note: ‘sprintf’ output between 2 and 23 bytes into a destination of size 12
60 | sprintf(cmd, "%s%d", pstree, pid);

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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
 
void identifiers(); // function that display identifiers
void forkMethod(); // function that calls fork() function 3 times
void tree(int); // function displaying processes tree
 
int main(void)
{ 
identifiers(); // displaying ID's for parent process
printf("Parent pid: %d\n", getpid());   
printf("Child processes: \n");      
 
forkMethod();   
 
return 0;
}
 
void forkMethod()
{
int k;
int status;
int pid;
 
for (k=0;k<3;k++){
pid = fork();
    switch (pid) {
    case -1:
        perror("fork error");
        exit(EXIT_FAILURE);
        break;
    case 0: 
    identifiers(); 
    exit(0);             
    default:           
    tree(getpid());            
    wait(&status); 
        sleep(1);   
    break;
    }
}
}
 
void identifiers()
{
pid_t pid = getpid();
pid_t ppid = getppid();
pid_t uid = getuid();
pid_t gid = getgid();
printf("\nUID:%d GID:%d PID:%d PPID:%d ", uid, gid, pid, ppid);
}
 
void tree(int pid)
{
char pstree[] = "pstree -np "; 
char cmd[12];
sprintf(cmd, "%s%d", pstree, pid);
system(cmd);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2020, 15:31
Ответы с готовыми решениями:

Fork() процессы
Здравствуйте, Помогите please объяснить программу, что она выполняет (Linux) main() { int n; for (n=0;n&lt;10;n++) ...

Убить все процессы, fork()
Не могу понять как убить все процессы после того как условие в if становится истинным //start child processes //int status = 0; ...

Fork() возвращает -1
Есть модуль, которая слущает UDP порт на наличие данных, когда приходят данные, вызывается функция fork,родительский процесс возвращается...

3
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
10.11.2020, 22:13
Всё правильно.
Компилер не знает как уместить выхлоп размером в 23 байта в 12 байтный массив char`ов. Потому и матюгается на "переполнение буфера".
0
0 / 0 / 0
Регистрация: 18.10.2020
Сообщений: 62
10.11.2020, 22:51  [ТС]
Здравствуйте, можете подсказать в чем ошибка?

PID:14316 PPID:12568 UID:1000 GID:1000
Parent pid: 14316
Child processes:
pstree: invalid option -- '1'
Usage: pstree [-acglpsStTuZ] [ -h | -H PID ] [ -n | -N type ]
[ -A | -G | -U ] [ PID | USER ]
or: pstree -V

Display a tree of processes.


Задача Написать программу которая вызывает функцию fork() 3 раза, например в цикле(петле) и выпишите указанные выше идентификаторы для всех дочерних процессов. На основании результата выписать "генеалогическое дерево" создаваемых процессов. Сколько создаеться процессов и почему?


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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
 
#include <stdlib.h>
 
#include <unistd.h>
 
#include <sys/types.h>
 
#include <sys/wait.h>
 
 
void identifiers(); // function that display identifiers
 
void forkMethod(); // function that calls fork() function 3 times
 
void tree(int pid); // function displaying processes tree
 
 
 
int main(void)
 
{
 
    identifiers();
 
    printf("Parent pid: %d\n", getpid());
 
    printf("Child processes: \n");
 
    
    forkMethod();
 
 
    
    return 0;
 
}
 
 
 
void forkMethod()
 
 
 
{
 
    int k;
 
    int status;
 
    int pid;
 
    
    for(k = 0; k < 3; k++)
    {
        pid = fork();
            switch(pid)
            {
                case -1:
                    perror("fork error");
                    exit(EXIT_FAILURE);
                    break;
                case 0:
                    identifiers;
                    exit(0);
                default:
                    tree(getpid());
                    wait(&status);
                    sleep(1);
                    break;
            }
    }
}
 
 
void identifiers()
 
 
{
 
    pid_t pid = getpid();
 
    pid_t ppid = getppid();
 
    pid_t uid = getuid();
 
 
    pid_t gid = getgid();
 
    printf("\nPID:%d PPID:%d UID:%d GID:%d\n", pid, ppid, 
uid, gid);
 
 
 
}
 
void tree(int pid)
 
 
{
 
    char pstree[] = "pstree -np";
 
    char cmd[12];
 
    sprintf(cmd, "%s%d", pstree, pid);
 
    system(cmd);
 
}
Добавлено через 44 секунды
Здравствуйте, можете подсказать в чем ошибка?

PID:14316 PPID:12568 UID:1000 GID:1000
Parent pid: 14316
Child processes:
pstree: invalid option -- '1'
Usage: pstree [-acglpsStTuZ] [ -h | -H PID ] [ -n | -N type ]
[ -A | -G | -U ] [ PID | USER ]
or: pstree -V

Display a tree of processes.


Задача Написать программу которая вызывает функцию fork() 3 раза, например в цикле(петле) и выпишите указанные выше идентификаторы для всех дочерних процессов. На основании результата выписать "генеалогическое дерево" создаваемых процессов. Сколько создаеться процессов и почему?

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <stdio.h>
 
#include <stdlib.h>
 
#include <unistd.h>
 
#include <sys/types.h>
 
#include <sys/wait.h>
 
 
void identifiers(); // function that display identifiers
 
void forkMethod(); // function that calls fork() function 3 times
 
void tree(int pid); // function displaying processes tree
 
 
 
int main(void)
 
{
 
    identifiers();
 
    printf("Parent pid: %d\n", getpid());
 
    printf("Child processes: \n");
 
    
    forkMethod();
 
 
    
    return 0;
 
}
 
 
 
void forkMethod()
 
 
 
{
 
    int k;
 
    int status;
 
    int pid;
 
    
    for(k = 0; k < 3; k++)
    {
        pid = fork();
            switch(pid)
            {
                case -1:
                    perror("fork error");
                    exit(EXIT_FAILURE);
                    break;
                case 0:
                    identifiers;
                    exit(0);
                default:
                    tree(getpid());
                    wait(&status);
                    sleep(1);
                    break;
            }
    }
}
 
 
void identifiers()
 
 
{
 
    pid_t pid = getpid();
 
    pid_t ppid = getppid();
 
    pid_t uid = getuid();
 
 
    pid_t gid = getgid();
 
    printf("\nPID:%d PPID:%d UID:%d GID:%d\n", pid, ppid, 
uid, gid);
 
 
 
}
 
void tree(int pid)
 
 
{
 
    char pstree[] = "pstree -np";
 
    char cmd[12];
 
    sprintf(cmd, "%s%d", pstree, pid);
 
    system(cmd);
 
}
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
11.11.2020, 07:32
Цитата Сообщение от User1011 Посмотреть сообщение
C
1
2
3
char pstree[] = "pstree -np";
char cmd[12];
sprintf(cmd, "%s%d", pstree, pid)
Если к строке "pstree -np" приклеить число (pid, к примеру, 1234), то получится pstree -np1234 . Естественно pstree будет ругаться на такую опцию.

И да, размер буфера для команды так и не изменили - у Вас явное переполнение буфера, и варнинг компилятора: "‘sprintf’ output between 2 and 23 bytes into a destination of size 12" никуда не делся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.11.2020, 07:32
Помогаю со студенческими работами здесь

Fork,waitpid
Имеется программа написанная на Си,которая выполняет рекурсивный поиск файлов в каталогах и добавляет к началу имени файла его порядковый...

Fork() вместо getpid
Задание из инста: Разработайте на языке «С» программу создающую заданное в параметрах количество процессов, посылки сигнала SIGALRM всем...

Popen не вызывает fork
Столкнулся с проблемой.В программе с помощью popen вызываю другую программу в качестве дочернего процесса.Все работает,но в терминале я...

Нюансы работы fork()
Всем привет. Вопрос такой. Есть программа, которая записывает себе в статические переменные важные данные. Запись процесс...

Pipe, fork, shared memory
Доброго времени суток. Помогите пожалуйста написать программу: Процесс читает с клавиатуры и пишет в пайп, его ребенок читает из этого...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru