Gibt es unter Linux etwas ähnliches wie das Arbeiten mit Semaphoren, um eine gestartete Anwendung von einer anderen aus zu steuern, z.B. eine andere Datei aufrufen?
In Windows geht das ungefähr so:
Projektdatei (Danke an den unbekannten Autor, den ich mir nicht gemerkt haben):
Code: Alles auswählen
......
const
MyGUID = '{166EBBD0-9052-49AA-9A27-AD15F3073563}';
var Semaphore: THandle;
// prevent multible instances of program (Semaphore)
procedure WriteStringToMMF(MMFName, Str: string);
var Map: Cardinal; Data: Pointer;
begin
// create a MMF-object
Map := CreateFileMapping(
INVALID_HANDLE_VALUE, // Keine Quelldatei
nil, // Keine Sicherheitsattribute
PAGE_READWRITE, // Voller Zugriff
0, // Minimalgröße
Length(Str) + 4, // Maximalgröße
PChar(MMFName)); // Name des MMF-Objekts
if (Map <> 0) then
begin
// map MMF-Object
Data := MapViewOfFile(
Map, // Handle des MMF-Objekts
FILE_MAP_WRITE, // Schreibzugriff
0, // Kein Start-Offset
0, // Kein Start-Offset
0); // Gesamte Größe mappen
if (Assigned(Data)) then
begin
// write string length to MMF
PCardinal(Data)^ := Length(Str);
// write string to MMF
CopyMemory(Pointer(Cardinal(Data) + 4), Pointer(Str), Length(Str));
// close mapping
UnmapViewOfFile(Data);
end;
end;
end;
begin
ActivationMessage := RegisterWindowMessage(PChar(MyGUID));
Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));
// test on an existing semaphore
if (GetLastError = ERROR_ALREADY_EXISTS) then
begin
WriteStringToMMF(MyGUID + 'MMF', CmdLine);
PostMessage(HWND_BROADCAST, ActivationMessage, 0, 0);
Exit;
end;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
MainForm.ServeCommandLineOfApplication(CmdLine);
Application.Run;
CloseHandle(Semaphore);
end;
Code: Alles auswählen
procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var aCmdLine:string;
begin
if (Msg.message = ActivationMessage) then
begin
aCmdLine := ReadStringFromMMF(MyGUID + 'MMF');
if aCmdLine <> '' then
ServeCommandLineOfApplication(aCmdLine);
Handled := True;
end;
end;