C - podstawy pisania pod linuxem... procesy, sygnały, funkcje...

Odpowiedz Nowy wątek
2014-12-19 15:40
0

Cześć,
mam taki kod:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
 
void catch_ctlc( int sig_num )
{
  printf( "Przechwycilem sygnal!\n" );
}
 
int main()
{
    printf("Co ile sekund wypisywac napis?\n");
    long n;
    scanf("%d", &n);
    signal( SIGINT, catch_ctlc );
    while (1)
    {
        printf("Dzialam dalej...\n");
        sleep(n);
    }
 
    return 0;
}

I takie pytanka:

  1. jak zakończyć ten program z konsoli? Bo jak zrobię Ctrl+Z to tylko stopuję...
  2. jakiej funkcji zamiast sleep mógłbym użyć do odmierzania czasu? alarm??

Pozdrawiam.

Acha, jak gdzieś widzicie jakieś podstawowe błędy to proszę o uwagę i napisanie czemu tak a nie inaczej :-) - bbxb 2014-12-19 15:41

Pozostało 580 znaków

2014-12-19 15:51
0

1) sproboj ctrl + c
2) biblioteka time

Ctrl+C to mi przechwytuje program właśnie... :) - bbxb 2014-12-19 15:52
W konsoli to robię kill -SIGKILL (numer procesu) ale jak to zrobić z klawiatury? - bbxb 2014-12-19 15:53

Pozostało 580 znaków

2014-12-19 20:33
0

I jeszcze mam takie pytanie... po co w tej funkcji dopisywać fflusha??

void catch_ctlc( int sig_num )
{
  printf( "Przechwycilem sygnal!\n" );
  fflush(stdout);
}

Pozostało 580 znaków

2014-12-20 11:01
2

Ponieważ stdout jest buforowane.
Pewnie proces został uśpiony, mechanizmy systemu nie czuwają nad buforem stdout i bezpośrednio nie "wyrzucają" jego zawartości, dlatego należny to wykonać ręcznie.

Pozostało 580 znaków

2014-12-20 22:12
0

Dziękuję za odpowiedź!
Mam nowy problem z tym kodem... mianowicie na zajęciach kazali mi dopisać do tego taką rzecz, żeby wychodzenie i kończenie programu odbywało się z poziomu programu/kodu. Tzn. mam przechwycić jakiś sygnał i tak go obsłużyć, aby program się wyłączył.
Do tej pory robiłem CTRL+Z ale tak nie może być, musi to być kończenie inne.
Chyba chodzi o to aby użyć funkcji kill() w kodzie... dobrze myślę?

Pozostało 580 znaków

2014-12-20 22:34
Panix

kill -9
killall

Pozostało 580 znaków

2014-12-21 08:28
0

Te polecenia to znam ale one są wypisywane z konsoli... a tak nie może być... muszę przechwycić sygnał do programu, wyświetlić jakiś komunikat np. "Kończenie pracy..." i dopiero wtedy zamknięcie.

Pozostało 580 znaków

2015-01-08 14:31
0

Witam,
napisałem takie coś.
Działać działa tak jak chciałem ale czy tu wszystko jest zgodnie ze sztuką?
Czy coś tu można napisac lepiej?

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
 
void catch_ctlc( int sig_num )
{
  printf( "Przechwycilem sygnal CTRL+C!\n" );
}
 
void catch_ctlq( int sig_num )
{
  printf( "Przechwycilem sygnal CTRL+\\!\n" );
  printf( "Wychodze z programu...\n" );
  sleep(5);
  exit(0);
}
 
int main()
{
    printf("Co ile sekund wypisywac napis?\n");
    long n;
    scanf("%d", &n);
    signal( SIGINT, catch_ctlc );
    signal( SIGQUIT, catch_ctlq );
    while (1)
    {
        printf("Dzialam dalej...\n");
        sleep(n);
    }
 
    return 0;
}

Pozostało 580 znaków

2015-01-08 14:46
0

Na takie pytanie można odpowiedzieć dopiero kiedy jest wgląd w treść zadania.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-08 15:41
0

Taka jest treść zadania:
//Napisz program, który co n sekund wypisuje na ekranie komunikat: "Działam dalej". Naciśnięcie klawiszy CTRL+c
(sygnał INT) wypisuje napis "Przechwycilem sygnal" i program kontynuuje działanie. Jakiej funkcji użyjesz do
odmierzania czasu? Jak zakończyć ten program?//

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0