# C Programm unter Linux nur einmal starten



## Merten1982 (10 Juni 2007)

Ich habe ein C Programm unter Linux und möchte verhindern das es auf einem Rechner mehrfach gestartet wird. Wie geht das am einfachsten?


----------



## Thomas_v2.1 (11 Juni 2007)

Am einfachsten ist es sicher das eigentliche Programm mittels einen Shellskriptes zu starten und darin die Prozessanzeige "ps" auszuwerten. Angenommen dein Programm heißt "testprogramm":

```
#!/bin/sh
if ps a|grep testprogramm;
    then echo "testprogramm laeuft schon";
else echo "testprogramm laeuft nicht, wird gestartet.";
    /home/thomas/testprogramm;
fi
```
Um das direkt aus dem C-Programm auszuwerden wirds sicherlich mit fork() und exec() etwas aufwändiger.


----------



## argv_user (12 Juni 2007)

*Lockfile*



Merten1982 schrieb:


> Ich habe ein C Programm unter Linux und möchte verhindern das es auf einem Rechner mehrfach gestartet wird. Wie geht das am einfachsten?



Die traditionelle Methode ist die Benutzung eines LOCKFILES.
Du legst zuerst den Namen des Lockfiles fest, zB /var/lock/progname.
Beim Aufruf deines Programmes schaust du zuerst, ob es das
Lockfile schon gibt. 
Falls ja: Programm läuft schon, Ende.
Falls nein: Erzeuge das Lockfile, und weiter im Programm
Zum Schluss noch Lockfile löschen.


Die Methode von Thomas_v2.1 funktioniert natürlich auch, jedoch muss
dann sichergestellt sein, dass dein Programm nicht noch auf andere Art
aufgerufen wird.

Du hast also die Wahl.
Ciao.


----------



## zotos (12 Juni 2007)

argv_user schrieb:


> Die traditionelle Methode ist die Benutzung eines LOCKFILES.
> Du legst zuerst den Namen des Lockfiles fest, zB /var/lock/progname.
> Beim Aufruf deines Programmes schaust du zuerst, ob es das
> Lockfile schon gibt.
> ...




Das kann aber echte Probleme bereiten. Geh mal von einem Stromausfall aus während das Programm läuft.

Dann muss man den Lockfile von Hand löschen.


----------



## Vbxler (12 Juni 2007)

Unter Windows macht man das mit:


```
[B]HANDLE CreateMutex(   LPSECURITY_ATTRIBUTES[/B][I] lpMutexAttributes[/I][B],[/B] // pointer to security attributes  [B] 
BOOL[/B][I] bInitialOwner[/I][B],  [/B]// flag for initial ownership  [B] 
LPCTSTR[/B][I] lpName[/I]       // pointer to mutex-object name [B]);[/B]
```
Das Gegestück zu *CreateMutex* ist in Linux '*pthreads_mutex_init*'.
Ich kann Dir leider keinen Code in Linux anbieten, aber mit Hilfe dieser Funktion 
sollte das möglich sein. 
Mit Google findet man mit 'pthread_mutex_init process' sehr viel über das Thema.

Servus


Vbxler


----------

