diff --git a/main.c b/main.c index d7837d1c9265ca195709cac695a4a0953e398a93..2b84f49883e0b39ee70ca67631fea24646800e32 100644 --- a/main.c +++ b/main.c @@ -7,156 +7,111 @@ #include <errno.h> #include <zlib.h> -// static const char *PIPE_ONE = "/tmp/pipeOne"; -// static const char *PIPE_TWO = "/tmp/pipeTwo"; -static const char *CHAR_DEV = "/dev/packet_receiver"; - -// static const char *SENDER_ID = "0x91"; - -ssize_t read_pipe(int *fd, char *buf, size_t bufSize, const char *pipeName) { - // Alles mit 0 füllen, um es später einfach als String verarbeiten zu können. - memset(buf, 0, bufSize); - - // Blocking read - ssize_t bytesRead = read(*fd, buf, bufSize - 1); - if (bytesRead > 0) { - // buf[bytesRead] = '\0'; // Schon durch memset garantiert - return bytesRead; +#define MAX_PROCESSES 10 +#define PIPE_DIR "/tmp/" //name von pipe ist jetzt gleich name von process +// bsp.: /usr/local/bin/cpu_temp hat die pipe /tmp/cpu_freq +#define PROCESS_MONITORING_DIR "/Processes/process_monitoring.sh" //bitte überprüfen ob das die richtige DIR ist + +typedef struct { + char name[256]; //processname + char pipe_path[256]; + int fd; +} ProcessPipe; + +ProcessPipe processes[MAX_PROCESSES]; //bis auf 10 prozesse skalierbar +int process_count = 0; + +void scan_processes() { + FILE *file = fopen(PROCESS_MONITORING_DIR, "r");//file öffnen + if (!file) { + perror("Could not open process file"); + exit(EXIT_FAILURE); //break; oder return 1; ? } - if (bytesRead == 0) { - // EOF -> Schreibseite geschlossen - printf("Pipe '%s' closed by writer. Reopening...\n", pipeName); - close(*fd); - // Neu öffnen (blockierend) - *fd = open(pipeName, O_RDONLY); - if (*fd == -1) { - perror("Reopen pipe"); + char line[512]; + while (fgets(line, sizeof(line), file) && process_count < MAX_PROCESSES) { + if (strncmp(line, "/usr/local/bin/", 15) == 0) {//zeilenweise nach prozessen suchen + char *newline = strchr(line, '\n'); + if (newline) { + *newline = '\0'; + } + //prozess in dateistruktur schreiben + snprintf(processes[process_count].name, sizeof(processes[process_count].name), "%s", strrchr(line, '/') + 1); + snprintf(processes[process_count].pipe_path, sizeof(processes[process_count].pipe_path), "%s%s", PIPE_DIR, processes[process_count].name); + // mkfifo() nur ausführen, wenn die Pipes noch nicht existieren, + // bzw. Fehler ignorieren, falls schon existiert: + if (mkfifo(processes[process_count].pipe_path, 0666) < 0 && errno != EEXIST) {//mkfifo machen + perror("mkfifo failed"); + exit(EXIT_FAILURE); + } + process_count++; } - // bytesRead = 0 bedeutet hier: wir haben keine Daten - return 0; } - - // Fehlerfall (bytesRead < 0) - perror("read pipe"); - return -1; + fclose(file); } -void build_package(char *package, size_t package_size, const char *payload, int value_id) { - // Zwischenspeicher für die neue Komponente - char tmp[128]; - // VALUE_ID=<id> VALUE=<payload> - snprintf(tmp, sizeof(tmp), " VALUE_ID=%d VALUE=%s", value_id, payload); - - // Hänge tmp an package - strncat(package, tmp, package_size - strlen(package) - 1); -} - -void build_crc_checksum(char *package, size_t package_size) { - // CRC berechnen - uLong c = crc32(0L, Z_NULL, 0); - c = crc32(c, (const Bytef*)package, strlen(package)); - - char tmp[32]; - // z.B. " CRC=0x1A2B3C4D" - snprintf(tmp, sizeof(tmp), " CRC=0x%08lX", c); - - // ans package anhängen - strncat(package, tmp, package_size - strlen(package) - 1); -} - -void send_package(const char *package, const int fdCharDev) { - char transmitBuf[256] = {0}; - - // Kopiere Package in transmitBuf - snprintf(transmitBuf, sizeof(transmitBuf), "%s", package); - - const ssize_t written = write(fdCharDev, transmitBuf, strlen(transmitBuf)); - if (written < 0) { - perror("write /dev/packet_receiver"); - } else { - printf("Wrote %ld bytes to %s\n", written, CHAR_DEV); - } -} - -// argc = Anzahl Pipes *argv[] Pipe Pfade -int main(const int argc, char *argv[]) { - const int num_pipes = argc - 1; - - int *fds = calloc(num_pipes, sizeof(int)); - if (!fds) { - perror("calloc fds"); - return 1; - } - - for (int i = 0; i < num_pipes; i++) { - const char *pipeName = argv[i + 1]; - // mkfifo() nur ausführen, wenn die Pipes noch nicht existieren, - // bzw. Fehler ignorieren, falls schon existiert: - if (mkfifo(pipeName, 0666) < 0 && errno != EEXIST) { - perror("mkfifo pipe"); - free(fds); - return 1; - } - - // Pipes blockierend öffnen - fds[i] = open(pipeName, O_RDONLY); - if (fds[i] == -1) { - perror("open pipe for reading"); - free(fds); - return 1; +void open_pipes() {//pipe blockierend öffnen + for (int i = 0; i < process_count; i++) { + processes[i].fd = open(processes[i].pipe_path, O_RDONLY); + if (processes[i].fd == -1) { + perror("Error opening pipe"); + exit(EXIT_FAILURE); } } +} - // Open the char device for writing - const int fdCharDev = open(CHAR_DEV, O_WRONLY); - if (fdCharDev == -1) { - perror("open /dev/packet_receiver"); - // Aufräumen - for (int i = 0; i < num_pipes; i++) { - close(fds[i]); - } - free(fds); - return 1; - } - printf("Opened %s for writing.\n", CHAR_DEV); - - // Dauerhafte Lese-Schleife - while (1) { - char package[256]; - snprintf(package, sizeof(package), "SENDER=0x91"); - - // Lese von jeder Pipe und ergänze das Package - for (int i = 0; i < num_pipes; i++) { - char pipeBuf[128]; - - const ssize_t ret = read_pipe(&fds[i], pipeBuf, sizeof(pipeBuf), argv[i + 1]); - if (ret > 0) { - // ret Bytes gelesen in pipeBuf -> package anhängen - build_package(package, sizeof(package), pipeBuf, i); - } else if (ret == -1) { - // Fehler beim Lesen - fprintf(stderr, "Error reading from pipe\n"); - free(fds); - return 1; +void read_pipes() { + while (1) {//alle pipes in dauerschlife nacheinander lesen + for (int i = 0; i < process_count; i++) { + char buffer[128] = {0}; + // read() kann blockieren, wenn noch keine Daten da sind, + // da wir blockierendes I/O verwenden. + // Wenn die Schreibseite offen bleibt, kommen periodisch neue Daten. + ssize_t bytes_read = read(processes[i].fd, buffer, sizeof(buffer)); + if (bytes_read > 0) { + // Gültige Daten -> ausgeben + printf("%s: %s\n", processes[i].name, buffer); + } else if (bytes_read == 0) { + // EOF -> Schreibseite hat geschlossen + // -> ggf. Pipe erneut öffnen + printf("%s closed, reopening...\n", processes[i].name); + close(processes[i].fd); + processes[i].fd = open(processes[i].pipe_path, O_RDONLY); + if (processes[i].fd == -1) { + perror("Reopen pipe"); + exit(EXIT_FAILURE); + } + } else { + // bytesReadOne < 0 => Fehler + if (errno == EINTR) { + // Signal unterbrochen, einfach weiter + continue; + } + perror("read error"); + exit(EXIT_FAILURE); } } - build_crc_checksum(package, sizeof(package)); - - // Jetzt an /dev/packet_receiver schicken - if (strlen(package) > 0) { - send_package(package, fdCharDev); - } - // Kurze Pause, damit CPU-Last nicht durch // Dauerschleife hochgetrieben wird - usleep(200000); // 200 ms + usleep(200000);//20ms } // Sollte man jemals aus der while(1)-Schleife ausbrechen: - for (int i = 0; i < argc; i++) { - close(fds[i]); + close_pipes(); +} + +void close_pipes() {//braucht man das? + for (int i = 0; i < process_count; i++) { + close(processes[i].fd); } + return; +} +int main() { + scan_processes(); + open_pipes(); + read_pipes(); return 0; } + +