Thread Design

Hallo zusammen

Ich würde gerne eine Anwendung schreiben die unter Linux laufen soll, die aber aus z.B.
zwei Threads besteht.

Der erste ist der Main Thread und der zweite z.B. ein Verarbeitungsthread.

Jetzt möchte ich aber zur Laufzeit Statusinformationen ueber den laufenden Verarbeitungsthred abfragen können:

Code:
application status

Wenn also die Anwendung mit dem Parameter 'status' aufgerufen wird so muss also die
neue Programminstanz in der lage sein die schon laufenden Anwendung darüber zu
benachrichtigen das sie Statusinformationen ausgeben soll.

Weiß jemand wie man sowas möglichst einfach implementieren könnte ?

Vielleicht wäre ja eine Möglichkeit Message- oder FIFO Queues über die die unterschiedlichen Instanzen kommunizieren könnten.
 
Hallo,

was ich deinem Post entnehmen kann möchtest du die Kommunikation zwischen 2
Prozessen realisieren:

Schau mal hier:

server.c:

Code:
#include "message.h"
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <signal.h>
#include <stdlib.h>

int counter = 0;
int mqd = 0;

void* worker(void* arg){
    while(1){
        sleep(1);
        counter++;
    }
}

void interrupted(int signr){
    msgctl(mqd, IPC_RMID, NULL);
    exit(0);
}

int main(){
    pthread_t thread;
    message msg;
    signal(SIGINT, interrupted);
    if(pthread_create(&thread, NULL, worker, NULL)){
        perror("Error  while executing pthread_create()");
        return 1;
    }
    if((mqd = msgget(MQ_KEY, IPC_CREAT | 0660 | IPC_EXCL)) < 0){
        perror("Error while executing msgget()");
        return 1;
    }
    while(1){
        if(msgrcv(mqd, &msg, sizeof(msg.cmd), 1, 0) < 0) perror("Error while executing msgrecv: ");
        if(strcmp(msg.cmd, "status") == 0)
            printf("Counter is: %d\n", counter);
        else if(strcmp(msg.cmd, "quit") == 0)
            break;
        else
            printf("Cannot execute command!\n");

    }
    msgctl(mqd, IPC_RMID, NULL);
    return 0;
}

client.c:

Code:
#include "message.h"
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv){
    int mqd;
    message msg;
    if(argc != 2){
        printf("Wrong usage!\n");
        return 1;
    }
    if(strlen(argv[1]) >= MAX_LENGTH - 1){
        printf("Command should have less than %d chars!\n", MAX_LENGTH - 2);
        return 1;
    }
    if((mqd = msgget(MQ_KEY, 0660)) < 0){
        perror("Error while executing msgget()");
        return 1;
    }

    strcpy(msg.cmd, argv[1]);
    msg.mtype = 1;
    printf("%d %d %d %d\n", mqd, msg.mtype, sizeof(msg.cmd), MQ_KEY);
    if(msgsnd(mqd, &msg, sizeof(msg.cmd), 0 | !IPC_NOWAIT) < 0)
        perror("Error while executing msgsnd()");
    return 0;
}

message.h:

Code:
#define MQ_KEY 0xfac23
#define MAX_LENGTH 20

typedef struct{
    long mtype;
    char cmd[MAX_LENGTH];
}message;

Weiter Informationen zu den Funktionen findest du in den man pages.

Eine andre Variante IPC zu realisieren wäre über shared memory. Siehe dazu
Code:
man shmget
usw.

Im Internet gibt es zu message queues und shared memory auch etliche Beispiele...

P.S.:

Erst musst du den server aufrufen. Dann den Client mit einem Argument.
Gruß

RedWing
 
Zurück