Created
December 11, 2017 17:00
-
-
Save bbagno/284c2181a6c0ba3e33a890a9b0d7bd1a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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