Bisher habe ich geschafft: Entweder wird
1. nur eine Zeile gelesen, nach X ausgegeben und dann beendet sich das Programm.
2. gar nichts nach X ausgegeben, aber 100% CPU.
Hier mal der Code. Auskommentierten Testcode habe ich absichtlich nicht entfernt. Aktueller Stand: 1. Variante. Das Programm soll sich aber nicht beenden, sondern weiterlaufen...
Kompiliert wurde mit: "gcc -pedantic -Wall -Werror -Wextra -lX11 -o myxd myxd.c"
Über Hilfe würde ich mich sehr freuen! Ich habe mir echt schon viel Mühe gegeben, kriege es aber einfach nicht hin...

Code: Alles auswählen
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
static const char program_name[] = "myxd";
static Display *dpy;
static int screen;
static Window root;
int
main(void)
{
char *display_name = NULL;
char name[128];
/* int ch; */
/* FILE *in; */
int in;
dpy = XOpenDisplay(display_name);
if (!dpy) {
fprintf(stderr, "%s: unable to open display '%s'\n",
program_name, XDisplayName (display_name));
exit (2);
}
root = RootWindow(dpy, screen);
in = open("/home/user/fifo", O_RDONLY);
/* in = fopen("/home/user/fifo", "r"); */
/* in = fdopen(fd, "r"); */
/*
* if (in == NULL) {
* perror("fopen");
* exit(EXIT_FAILURE);
* }
*/
/* (ch = getchar()) != '\n' && ch != EOF */
while (read(in, name, 128) > 0) {
/* get input */
/* fgets(name, 128, in); */
/* fgets(name, 128, stdin); */
/* read(0, name, sizeof(name)); */
/* Handle set name */
if (name[0] != '\0' && name[0] != '\n') {
/*
* remove trailing newline - so use echo or printf '%s\n'
* for input
*/
name[strlen(name)-1] = 0;
XStoreName(dpy, root, name);
}
}
XCloseDisplay(dpy);
/* fclose(in); */
close(in);
exit(EXIT_SUCCESS);
}