Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°Π±ΠΎΡΡ Π²ΡΠ·ΠΎΠ²Π°
spawn*()
exec()
β’Β Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ( p1) ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ( p1ch) ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡ Π½Π΅Π³ΠΎ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π°
SIGUSR1
β’Β ΠΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠΈΠ³Π½Π°Π»
SIGUSR1
β’Β Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ (Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°) Π΄Π»Ρ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ: ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΏΠΎΡΡΠ»ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° (1-ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π·Π°Π΄Π°Π½ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ) ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ (2-ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ°Π½ΡΠ»ΠΈΡΡΠ΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ).
Π Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ
spawnl()
ΠΡΠ°ΠΊ, ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ( ΡΠ°ΠΉΠ» p1.cc):
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <signal.h>
#include <unistd.h>
#include <sched.h>
// ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π°
static void handler(int signo, siginfo_t* info, void* context) {
Β int oldprio = getprio(0);
Β setprio(0, info->si_value, sival_int);
Β cout << "SIG = " << signo << " old priority = "
Β << oldprio << " new priority = " << getprio(0) << endl;
Β setprio(0, oldprio);
}
int main(int argc, char* argv[]) {
Β // ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π°
Β sigset_t sig;
Β sigemptyset(&sig);
Β //ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ #define SIGUSR1 16
Β sigaddset(&sig, SIGUSR1);
Β sigprocmask(SIG_BLOCK, &sig, NULL);
Β struct sigaction act;
Β act.sa_mask = sig;
Β act.sa_sigaction = handler;
Β act.sa_flags = SA_SIGINFO;
Β if (sigaction(SIGUSR1, &act, NULL) < 0)
Β perror("set signal handler"), exit(EXIT_FAILURE);
Β // ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ (Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ) ΠΏΡΠΎΡΠ΅ΡΡ
Β const char* prg = "./p1ch", *sdelay = "3";
Β pid_t pid =
Β ((argc > 1 ) && (atoi(argv[1]) >= sched_get_priority_min(SCHED_RR)) &&
Β (atoi(argv[1]) <= sched_get_priority_max(SCHED_RR))) ?
Β spawnl(P_NOWAIT, prg, prg, sdelay, argv[1], NULL) :
Β spawnl(P_NOWAIT, prg, prg, sdelay, NULL);
Β if (pid == -1)
Β perror("spawn child process"), exit(EXIT_FAILURE);
Β // ΡΠ°Π·ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΡΠΈΠ³Π½Π°Π»Π°.
Β sigprocmask(SIG_UNBLOCK, &sig, NULL);
Β while (true) {
Β if (sleep(3) != 0) continue;
Β Β cout << "parent main loop: priority = " << getprio(0) << endl;
Β }
}
ΠΠΎΡΠ΅ΡΠ½Π΅Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ( ΡΠ°ΠΉΠ» p1ch.cc), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π²ΡΡΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ:
#include <stdio.h>
#include <iostream.h>
#include <sched.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[]) {
Β int val, del = 5;
Β if ((argc > 1) &&
Β (sscanf(argv[1], "%i", &val) == 1) && (val > 0)) del = val;
Β if ((argc > 2) &&
Β (sscanf(argv[2], "%i", &val) == 1 ) && (val > 0) &&
Β (val <= sched_get_priority_max(SCHED_RR)))
Β if (setprio(0, val) == -1) perror("set priority");
Β // ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ SIGUSR1, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
Β // Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΡΠΈΠ³Π½Π°Π» ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ):
Β while(true) {
Β sleep(del);
Β union sigval val;
Β val.sival_int = getprio(0);
Β // #define SIGUSR1 16
Β sigqueue(getppid(), SIGUSR1, val);
Β }