Optil.io help - handling signals

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.

C

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;
}

C++

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)

Python 2

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)

Python 3

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))

Java

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));
    }
}

Haskell

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)

C++ with CPLEX

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;
}

VB.NET

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