Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
1

Продемонстрировать список процессов (ps -l) до и после выполнения программы

11.02.2020, 07:04. Показов 628. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! На данном форуме я неоднократно получал помощь от специалистов-программистов, за что вам огромное спасибо. И в этот раз также хочу обратиться к вам, т.к без помощи мне не обойтись)
Есть лабораторная работа, которая в принципе уже готовая (код в конце сообщения), но преподователю принципиально продемонстрировать список процессов (ps -l) до и после выполнения программы, может скриншотами. Если кого не затруднит, помогите решить данный вопрос. Спасибо в любом случае.
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
// 10. Процесс-отец открывает существующий текстовый файл, а затем 
// порождает два дочерних процесса, которые по очереди выводят 
// содержимое этого файла фиксированными порциями по 22 символа, 
// предваряя каждый вывод номером своего процесса. Вывод на экран
// заканчивается или при достижении конца файла, или по истечении
// интервала времени в 12 секунд.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <time.h>
static int daughter;
FILE *fil;
static pid_t pids[2];
 
int main(int argc, char *argv[]) {
        pid_t pid;
        int pipefd[4];
        FILE *fs[4];
        struct timeval tv;
        int retval;
        fd_set rfds;
        if(argc != 2) {
                fprintf(stderr, "Необходимо имя файла\n");
                exit(1);
        }
        if((fil = fopen(argv[1], "r")) == NULL) {       // открытие
                perror("Невозможно открыть файл");
                exit(1);
        }
        for(daughter=0; daughter<2; daughter++) {
                if(pipe(pipefd+daughter*2) == -1) {
                        perror("pipe");
                        exit(EXIT_FAILURE);
                }
                // потоки для труб
                fs[daughter*2+1] = fdopen(pipefd[daughter*2+1], "w");
                if((pid = fork()) != 0) {
                        fprintf(stderr, "Порождён процесс %d\n", pid);
                        pids[daughter] = pid;
                } else {
                        char buf[23], c;
                        int n = 0;
                        buf[22] = 0;
                        pid = getpid();                 // получить pid
 
                        FD_ZERO(&rfds);
                        FD_SET(pipefd[daughter*2], &rfds);
 
                        /* Wait up to one second. */
                        tv.tv_sec = 1;
                        tv.tv_usec = 0;
                        while(1) {
                                retval = select(pipefd[daughter*2]+1, &rfds,
                                                        NULL, NULL, &tv);
                                if(retval < 1) break;           // 
                                if(read(pipefd[daughter*2], &c, 1)<1) break;
                                        buf[n++] = c;
                                if (n % 22 == 0) {
                                        printf("%5d: %s\n", pid, buf);
                                        n = 0;
                                }
                        }
                        if(n > 0)  {
                                buf[n] = L'\0';
                                printf("%5d: %s\n", pid, buf);
                        }
                        exit(0);
                }
        }
        if(daughter == 2) { // родительский процесс
                int t=time(0);
                int i;
                char c;
                char buf[22];
                while(1) {
                        int n, n1;
                        for(daughter=0; daughter < 2; daughter++) {
                                n = 0;
                                while(n < 22 && ((c = fgetc(fil)) != EOF))
                                    buf[n++] = c;     // читаем символ
                                buf[n] = 0;
                                if(n <= 0 || time(0)-t > 12) break;
                                n1 = fputs(buf, fs[daughter*2+1]);
                                fflush(fs[daughter*2+1]);
                        }
                        if(n <= 0 || time(0)-t > 12) break;  // был break выше
                }
                fclose(fs[1]);
                fclose(fs[3]);
                fclose(fil);
                while (pid = waitpid(-1, NULL, 0)) {
                        if (errno == ECHILD) break;
                }
                exit(0);
        }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2020, 07:04
Ответы с готовыми решениями:

Очередность выполнения процессов после fork()
Подскажите, что будет выводиться в консоль если поле вызова fork() внутри обоих процессов будет...

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

Как после выполнения двух последовательных команд START дождаться окончания обоих запущенных процессов?
ребят, подскажите пожалуйста как после выполнения START дождаться его окончания? есть скрипт:...

Получить список процессов по имени файлу программы
Здравствуйте. Как получить список процессов по имени файлу программы. Пробывал так:&quot;...

13
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
11.02.2020, 07:09 2
о мои глаза......

где адекватное форматирование, где выделение исходного кода через спецальный BB тег языка программирования?
0
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
11.02.2020, 09:39  [ТС] 3
Будем иметь в виду

Добавлено через 4 минуты
Я так понимаю, что нужен список процессов, типа ls -l. На shell у меня получалось, а на Си я пока не могу сделать, т.к данный код мне помогли написать
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
11.02.2020, 09:46 4
Цитата Сообщение от seregaTSV Посмотреть сообщение
Я так понимаю, что нужен список процессов, типа ls -l. На shell у меня получалось, а на Си я пока не могу сделать, т.к данный код мне помогли написать
На shell и сделай
0
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
11.02.2020, 09:57  [ТС] 5
нужно на Си
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
11.02.2020, 10:00 6
Цитата Сообщение от seregaTSV Посмотреть сообщение
нужно на Си
Не думаю. Скорее всего, твой преподаватель подозревает, что твоя программа отрабатывает неправильно - после неё остаются висеть процессы. Проверь.
0
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
12.02.2020, 05:57  [ТС] 7
Я так понял мне в данном вопросе никто не поможет?

Добавлено через 8 минут
И еще вопрос к специалистам. Как мне данный код запустить через терминал ubuntu? Если возможно, более подробно.

Добавлено через 2 минуты
Запустив через терминал ubuntu я уже буду пытаться выполнить данное требование
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2020, 09:34 8
Цитата Сообщение от seregaTSV Посмотреть сообщение
Я так понял мне в данном вопросе никто не поможет?
Сделай system("ps -l"), либо посмотри файлы в директории /proc
0
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
12.02.2020, 10:18  [ТС] 9
через visual studio не получится??
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2020, 10:20 10
Цитата Сообщение от seregaTSV Посмотреть сообщение
через visual studio не получится??
Ты под windows это делаешь или под linux?
0
0 / 0 / 0
Регистрация: 27.04.2019
Сообщений: 16
12.02.2020, 14:32  [ТС] 11
под linux
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2020, 15:21 12
Цитата Сообщение от seregaTSV Посмотреть сообщение
под linux
Ну а причём тогда здесь студия?
Так пробовал сделать?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай system("ps -l"), либо посмотри файлы в директории /proc
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
12.02.2020, 15:25 13
Если из кода вызвать system("ps -l"), то получим список процесов не до и не после, а во время выполнения.

Откройте терминал, командой cd перейдите в папку с файлом программы (или сразу из папки запустите терминал. Как это сделать не скажу, зависит от файлового менеджера. В контекстном меню ищите). В терминале напишите ps -l, получите список процессов до выполнения программы. Затем ./имя_файла_программы. Когда программа завершится, снова ps -l, получите список процессов после выполнения программы
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.02.2020, 15:27 14
seregaTSV, exit(1), exit(0) замени на return 1 и return 0 соответственно
0
12.02.2020, 15:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2020, 15:27
Помогаю со студенческими работами здесь

Разработка программы, выводящей в консоли список запущенных процессов в ОС семейства Windows
Народ помогите в создании Разработка программы, выводящей в консоли список запущенных процессов в...

Пустой список после выполнения метода
Здравствуйте! Есть два метода, после выполнения первого, список, который я объявил List&lt;Video&gt;...

Даны четыре величины целого типа. Продемонстрировать выполнения любых 3-х арифметических операций.
Задача : Даны четыре величины целого типа. Продемонстрировать выполнения любых 3-х арифметических...

Пропадает раскрывающийся список после выполнения действия
Есть окно состоящее из текста и двух раскрывающихся списков. Первое меняет шрифт текста второе...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru