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

C - podstawy pisania pod linuxem... procesy, sygnały, funkcje...
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

Cześć,
mam taki kod:

Kopiuj
#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.

BB
Acha, jak gdzieś widzicie jakieś podstawowe błędy to proszę o uwagę i napisanie czemu tak a nie inaczej :-)
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
0
  1. sproboj ctrl + c
  2. biblioteka time
BB
Ctrl+C to mi przechwytuje program właśnie... :)
BB
W konsoli to robię kill -SIGKILL (numer procesu) ale jak to zrobić z klawiatury?
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
0

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

Kopiuj
void catch_ctlc( int sig_num )
{
  printf( "Przechwycilem sygnal!\n" );
  fflush(stdout);
}
BA
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:51
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.

BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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ę?

1

kill -9
killall

BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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.

BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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?

Kopiuj
#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;
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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.
BB
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:80
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?//

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.