Skip to content

Instantly share code, notes, and snippets.

@bbagno
Created December 11, 2017 17:00
Show Gist options
  • Save bbagno/284c2181a6c0ba3e33a890a9b0d7bd1a to your computer and use it in GitHub Desktop.
Save bbagno/284c2181a6c0ba3e33a890a9b0d7bd1a to your computer and use it in GitHub Desktop.
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char command[10000][256]; // Список команд по порядку
int sleep_index[10000][2]; // Массив с задержками перед запуском и индексами команды, которую следует запускать
int n; // количество команд
/* Процедура для чтения списка команд и задержек перед выполнением.
* Чтение будет происходить с файла commands.txt, который должен находиться в том же каталоге, что и программа.
* Чтение будет происходить до тех пор, пока не прочтем ВЕСЬ файл.
*/
void read_commands(char *argv) {
n = 0;
FILE *cl;
cl = fopen(argv, "r");
while (cl == 0) {
printf("File not found! Execution aborted!\nPlease, re-enter the filename: ");
scanf("%s", argv);
cl = fopen(argv,"r");
}
while (1 == fscanf(cl,"%d",&sleep_index[n][0])) {
fgets(command[n], 256, cl);
sleep_index[n][1] = n;
n++;
}
fclose(cl);
}
/* Процедура отсорттирует команды в порядке их непосредственного выполнения (т.е. по задержке от начала работы программы)
*/
void sort() {
int t_time,t_index;
int f = 1;
int i = 0;
// Применяем алгоритм сортировки "пузырьком"
while (f) {
f = 0;
for (i = 0; i<n-1; i++)
if (sleep_index[i+1][0]<sleep_index[i][0]) {
t_time = sleep_index[i+1][0];
t_index = sleep_index[i+1][1];
sleep_index[i+1][0] = sleep_index[i][0];
sleep_index[i+1][1] = sleep_index[i][1];
sleep_index[i][0] = t_time;
sleep_index[i][1] = t_index;
f = 1;
}
}
// Преобразуем задержки таким образом, что это будет задержка после выполнения предыдущей команды, а не после начала работы нашей программы
for (i = n-1; i>0; i--)
sleep_index[i][0] -= sleep_index[i-1][0];
}
int main(int argc, char *argv[]) {
read_commands(argv[1]);
sort();
int i = 0;
sleep(sleep_index[0][0]); // Задержка перед выполнением первой команды
/* Выполняем команды.
* Для выполнения каждой команды мы будем создавать отдельный процесс, чтобы не ждать ее завершения и сразу переходить к выполнению следующей.
* Для создания отдельного процесса используем системный вызов fork(). Дочернему процессу он возвращает 0, а родительскому - PID дочернего.
* Таким образом, каждый процесс "знает", что нужно делать именно ему.
*/
while (i<n)
if (0 == fork()) {
system(command[sleep_index[i][1]]);
return 0;
}
else {
i++;
if (i<n)
sleep(sleep_index[i][0]);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment