Poniżej znajdują się przykłady nieoptymalnych programów rozwiązującychproblem z samouczka z prawidłową obsługą sygnałów. Więcej informacji na temat obsługi sygnałów można znaleźć na help.
Obecnie istnieje przykład dlaC, C++ (with CMake, z CPLEX), Python 2, Python 3, Java, Haskell, VB.NET. Jeśli potrzebujesz przykładu w jakimś innym języku, pozwól nam teraz.
Pamiętaj o słowie kluczowym volatile, aby upewnić się, że optymalizator nie usunie zmiennej z pętli for.
#include <signal.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <math.h> volatile sig_atomic_t tle = 0; int n, i; float worker; void term(int signum) { tle = 1; } int main(int argc, char *argv[]) { struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); action.sa_handler = term; sigaction(SIGTERM, &action, NULL); scanf("%d", &n); for (i = 0; i < n - 1 && !tle; i++) worker += sqrt((float)i); printf("%d\n", (int)(worker/n)); return 0; }
Pamiętaj o słowie kluczowym volatile, aby upewnić się, że optymalizator nie usunie zmiennej z pętli for.
#include <signal.h> #include <unistd.h> #include <cstring> #include <iostream> #include <cmath> using namespace std; volatile sig_atomic_t tle = 0; int n; float worker; void term(int signum) { tle = 1; } int main(int argc, char *argv[]) { struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); action.sa_handler = term; sigaction(SIGTERM, &action, NULL); ios_base::sync_with_stdio(false); cin >> n; for (int i = 0; i < n - 1 && !tle; i++) worker += sqrt((float)i); cout << (int)(worker / n) << endl; return 0; }
Jeśli chcesz użyć pakietu CMake, musisz dodać następującą zawartość do pliku CMakeLists.txt , zapisz powyższy kod w pliku tut.cpp i zapakuj oba. do archiwum Tut.tgz (uwaga na obudowę).
cmake_minimum_required (VERSION 2.6) project (Tut) add_executable (Tut tut.cpp)
import signal import time from math import sqrt class Killer: exit_now = False def __init__(self): signal.signal(signal.SIGINT, self.exit) signal.signal(signal.SIGTERM, self.exit) def exit(self,signum, frame): self.exit_now = True killer = Killer() n = int(input()) worker = 0.0 for i in xrange(0,n): worker += sqrt(i) if killer.exit_now: break print i print int(worker / n)
import signal import time from math import sqrt class Killer: exit_now = False def __init__(self): signal.signal(signal.SIGINT, self.exit) signal.signal(signal.SIGTERM, self.exit) def exit(self,signum, frame): self.exit_now = True killer = Killer() n = int(input()) worker = 0.0 for i in range(0,n): worker += sqrt(i) if killer.exit_now: break print(int(worker / n))
Kompilator Java informuje, że sygnał API jest przestarzały. Jednak nie planuje się go usuwać w Javie 9 i jest to jedyny sposób na obsługę sygnałów na serwerze.
import java.util.Scanner; import sun.misc.Signal; import sun.misc.SignalHandler; import java.util.concurrent.CountDownLatch; public class Tut { public static void main(final String[] args) throws InterruptedException { Scanner in = new Scanner(System.in); final CountDownLatch exit_now = new CountDownLatch(1); double worker = 0.0; int n; SignalHandler termHandler = new SignalHandler() { @Override public void handle(Signal sig) { System.out.println("Terminating"); exit_now.countDown(); } }; Signal.handle(new Signal("TERM"), termHandler); n = in.nextInt(); for (int i = 0; i < n && exit_now.getCount() == 1; i++) { worker += Math.sqrt((double)i); } System.out.print((int)(worker / n)); } }
Ten kod nie implementuje obsługi sygnałów. Jeśli wiesz, jak go zaimplementować w Haskell, prześlij nam przykład.
main = do n <- getLine let v = read n :: Int print (v-1)
Ten kod nie implementuje jeszcze obsługi sygnałów.
#include <ilcplex/ilocplex.h> ILOSTLBEGIN int main (int argc, char **argv) { int n; IloEnv env; IloModel model(env); IloNumVarArray var(env); IloRangeArray con(env); IloCplex cplex(model); cplex.setOut(env.getNullStream()); cin >> n; var.add(IloNumVar(env, 0, 1000000000, ILOINT)); model.add(IloMaximize(env, var[0])); con.add(var[0] <= (n - 1)); model.add(con); cplex.solve(); cout << cplex.getObjValue() << endl; env.end(); return 0; }
Ten kod nie implementuje jeszcze obsługi sygnałów. Jeśli wiesz, jak go zaimplementować w VB.NET at Mono, prześlij nam przykład.
Module Tutorial Sub Main() Dim line = Console.ReadLine() Dim n = Integer.Parse(line) Console.WriteLine(n - 1) End Sub End Module