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

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.

0
  1. sproboj ctrl + c
  2. biblioteka time
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);
}
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.

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

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.

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

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

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?//

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