0 / 0 / 0
Регистрация: 18.10.2020
Сообщений: 62

fork() процессы

10.11.2020, 15:31. Показов 1394. Ответов 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 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru