Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Signal kurzzeitig deaktivieren?

3 views
Skip to first unread message

Edzard Egberts

unread,
Apr 12, 2013, 7:45:41 AM4/12/13
to
Folgender Code dient der ᅵberwachung eines Verzeichnisses auf geᅵnderte
Dateien:

struct sigaction act;
act.sa_sigaction = scb_Auto_Dir; // statische Callback-Funktion
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN, &act, NULL);
m_Handle = open(m_Dir_Cfg.c_str(), O_RDONLY);
if (m_Handle > -1)
{
fcntl(m_Handle, F_SETSIG, SIGRTMIN);
fcntl(m_Handle, F_NOTIFY, DN_MODIFY|DN_MULTISHOT);
}

Das funktioniert einwandfrei, aber wenn das Programm eine Datei
schreibt, wirft das mehrere Signale, die nur stᅵren. Deshalb mᅵchte ich
fᅵr das Schreiben einer Datei dieses Signal kurzzeitig abschalten - wie
geht das am Elegantesten? Mit fcntl(m_Handle, NULL / F_NOTIFY) aus- und
wieder einschalten geht nicht und close(m_Handle) mit nachfolgender
kompletter Neuinitialisierung erscheint mir etwas grob.

BTW - was hat eigentlich SIGRTMIN zu bedeuten, was ich dazu finde,
verstehe ich nicht so recht.

Jochen Lübbers

unread,
Apr 12, 2013, 7:57:52 AM4/12/13
to
Edzard Egberts <ed...@tantec.de> schrieb:

Kannst Du SIGRTMIN nicht für die Operation ignorieren?

Ungefähr so (nur Prototype):

sighandler_t alterHandler = signal(SIGRTMIN, SIG_IGN);

<mach was>

(void) signal(SIGRTMIN, alterHandler);


HTH
Jochen
--
"Wer die Freiheit aufgibt, um Sicherheit zu gewinnen,
der wird am Ende beides verlieren"

Rainer Weikusat

unread,
Apr 12, 2013, 8:36:39 AM4/12/13
to
Edzard Egberts <ed...@tantec.de> writes:
> Folgender Code dient der �berwachung eines Verzeichnisses auf
> ge�nderte Dateien:
>
> struct sigaction act;
> act.sa_sigaction = scb_Auto_Dir; // statische Callback-Funktion
> sigemptyset(&act.sa_mask);
> act.sa_flags = SA_SIGINFO;
> sigaction(SIGRTMIN, &act, NULL);
> m_Handle = open(m_Dir_Cfg.c_str(), O_RDONLY);
> if (m_Handle > -1)
> {
> fcntl(m_Handle, F_SETSIG, SIGRTMIN);
> fcntl(m_Handle, F_NOTIFY, DN_MODIFY|DN_MULTISHOT);
> }
>
> Das funktioniert einwandfrei, aber wenn das Programm eine Datei
> schreibt, wirft das mehrere Signale, die nur st�ren. Deshalb m�chte
> ich f�r das Schreiben einer Datei dieses Signal kurzzeitig abschalten
> - wie geht das am Elegantesten?

Ueberhaupt nicht. Waehrend die Datei geschrieben wird, koennte 'etwas
anderes' in dem Verzeichnis geaendert werden und dafuer gaebe es dann
keine Benachrichtigung. Du koenntest die Datei in einem
Unterverzeichnis erstellen und danach via rename in das eigentliche
Verzeichnis bewegen.

[...]

> BTW - was hat eigentlich SIGRTMIN zu bedeuten, was ich dazu finde,
> verstehe ich nicht so recht.

Das steht fuer das Echtzeitsignal mit der kleinsten
Signalnummer. Echtzeitsignale sind fuer Anwendungen reserviert (NB: das
umfasst alles ausser dem Kernel, also auch die C library) und sie
haben, im Gegensatz zu normalen Signalen, keine 'Flaggensemantik', dh
falls ein Echzeitsignal mehrfach an einen Prozess geschickt wird,
empfaengt dieser auch mehrere Echtzeitsignale.

Rainer Weikusat

unread,
Apr 12, 2013, 8:39:18 AM4/12/13
to
Jochen L�bbers <jo...@buerotiger.de> writes:
> Edzard Egberts <ed...@tantec.de> schrieb:
>
> Kannst Du SIGRTMIN nicht f�r die Operation ignorieren?
>
> Ungef�hr so (nur Prototype):
>
> sighandler_t alterHandler = signal(SIGRTMIN, SIG_IGN);

Falls zu dem Zeitpunkt, an dem diese Operation wirksam wird, ein
SIGRTMIN auf 'Aufmerksamkeit' wartet ('pending'), dann faellt es
unwiederbringlich unter den Tisch.

Edzard Egberts

unread,
Apr 12, 2013, 8:53:57 AM4/12/13
to
Rainer Weikusat schrieb:
> Edzard Egberts<ed...@tantec.de> writes:
>> Das funktioniert einwandfrei, aber wenn das Programm eine Datei
>> schreibt, wirft das mehrere Signale, die nur st�ren. Deshalb m�chte
>> ich f�r das Schreiben einer Datei dieses Signal kurzzeitig abschalten
>> - wie geht das am Elegantesten?
>
> Ueberhaupt nicht. Waehrend die Datei geschrieben wird, koennte 'etwas
> anderes' in dem Verzeichnis geaendert werden und dafuer gaebe es dann
> keine Benachrichtigung. Du koenntest die Datei in einem
> Unterverzeichnis erstellen und danach via rename in das eigentliche
> Verzeichnis bewegen.

Es geht zwar um das Zur�cklesen einer manuell ge�nderten
Konfigurationsdatei, aber Du hast wahrscheinlich recht - wenn die
ge�ndert wird, dann *genau* in dem Moment... :o/

Ich lasse das Signal jetzt ein Flag setzen, das jede Sekunde ausgewertet
wird und dann die writetime der Datei �berpr�ft.

>> BTW - was hat eigentlich SIGRTMIN zu bedeuten, was ich dazu finde,
>> verstehe ich nicht so recht.
>
> Das steht fuer das Echtzeitsignal mit der kleinsten Signalnummer.

Danke, das habe ich schon besser verstanden.

Marcel Müller

unread,
Apr 12, 2013, 10:20:39 AM4/12/13
to
Hallo,

On 12.04.2013 13:45, Edzard Egberts wrote:
> Das funktioniert einwandfrei, aber wenn das Programm eine Datei
> schreibt, wirft das mehrere Signale, die nur stᅵren.

Du solltest Quelle und Ziel nicht im selben Ordner haben, dann gibt es
das Problem nicht.

Das ist wie "grep xxx * >log". Das geht maximal einmal gut. ;-)

> Deshalb mᅵchte ich
> fᅵr das Schreiben einer Datei dieses Signal kurzzeitig abschalten - wie
> geht das am Elegantesten? Mit fcntl(m_Handle, NULL / F_NOTIFY) aus- und
> wieder einschalten geht nicht und close(m_Handle) mit nachfolgender
> kompletter Neuinitialisierung erscheint mir etwas grob.

Wenn Du es abschaltest, hast Du eine Race-Condition. Denn wenn ein
anderes Programm just in dem Moment irgendetwas macht, bist Du in der
Zeit blind und bekommst die ᅵnderung mᅵglicherweise niemals mehr mit.
Wenn ᅵberhaupt, kannst Du nur versuchen irrelevante Signale zu erkennen
und zu ignorieren.


Marcel
0 new messages