#include #include #include #include #include #include #include #include #include #include #include #define MAX_THREADS 42 /** Opaque type of a semaphore. */ typedef struct SEM SEM; /* @brief Creates a new semaphore. * @param initVal The initial value of the semaphore. * @return Handle for the created semaphore, or NULL if an error * occurred. */ SEM *semCreate(int initVal); /* @brief Destroys a semaphore and frees all associated resources. * @param sem Handle of the semaphore to destroy. If a NULL pointer is * passed, the implementation does nothing. */ void semDestroy(SEM *sem); /* @brief P-operation. * @param sem Handle of the semaphore to decrement. */ void P(SEM *sem); /* @brief V-operation. * @param sem Handle of the semaphore to increment. */ void V(SEM *sem); /* @brief Start a connection * @param target String representation of the target. * @return File descriptor for the connection or -1 on error. * If -1 is returned, errno is set appropriately. */ int start_connection(const char *target); static int die(const char *msg) { perror(msg); exit(EXIT_FAILURE); } static void usage(const char *name) { fprintf(stderr, "USAGE: %s \n", name); } // Globale Variablen und Definitionen int main(int argc, char *argv[]) { // Globalen Zustand vorbereiten // Vorlagen suchen und Fäden starten // Finale Synchronisierung und Aufräumen } static void crawl(const char *dir) { // Über Verzeichniseinträge iterieren // Verzeichniseintrag prüfen // Arbeiterfaden mit Vorlage beauftragen // Aufräumen } void *worker(void *arg) { // Anfrage absetzen // Statusmeldung // Ressourcenfreigabe } int request(const char *target, const char *template) { } int send_template(FILE *tx, FILE *template) { } #include /* Von dieser Funktion wurde in der Aufgabenstellung angenommen, dass * sie bereits implementiert vorliegt. Es musste daher nicht in der * Klausur implementiert werden, aber ist notwendig um die Aufgabe zu * testen. Die Implementierung dieser Funktion hat offensichtlich * nichts mit der tatsächlichen Aufgabenstellung zu tun. */ int start_connection(const char *target) { char name[strlen(target) + 1 + 6 + 1]; sprintf(name, "%s-XXXXXX", target); int fd = mkstemp(name); assert(fd >= 0); return fd; }