|
![ein Kapitel weiter](../weiter.gif)
Unter Linux werden ja Geräte genauso wie Dateien angesprochen. Somit könnten sie wenn der
Drucker sich Beispielsweise am Parrallelen Port befindet, eine Datei mit dem Aufruf.....
cp datei.txt /dev/lp0
...oder...
cp datei.txt /dev/lp1
...ausdrucken lassen. Dies erweist sich aber nicht als komfortabel und sicher. Beim Systemstart wird daher der Druckerdämon lpd aufgerufen, der sich um die Umsetzung der Druckeraufträge kümmert. Mit dem Druckertool lpr können sie dann Ihre Texte komfortabler aufrufen.
Bei Aufruf von lpr ruft der Druckerdämon lpd einen neuen Prozess mit fork auf.
Aus diesem Prozeß wird anschließend ein Kinddämon (lpr), welcher dann unsere Arbeit
zu Drucken übernimmt. Somit können sie mit dem Aufruf...
lpr datei.txt
...drucken. Die unzähligen Optionen die mit lpr verwenden können entnehmen sie bitte aus der
man-Page. Weitere Druckertools währen....
- lpq - Gibt Auskunft zur Druckerwarteschlange
- lprm - Löscht Druckaufträge
- lpc - Für den Administrator (root), damit kann das ganze Druckersystem gesteutert werden
Dies soll nur ein kurzer Überblick zum Drucken unter Linux darstellen. Nach den Kapiteln
zuvor, denke ich mal das Ihnen das Drucken über eine Pipe als Programm nicht mehr sehr
schwer fallen dürfte.....
/*Download:pprint.c*/
#include <stdio.h>
#include <unistd.h>
#define BUF 8192
void an_den_drucker(char *text)
{
FILE *p;
/*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/
p=popen("lpr","w");
if(p == NULL)
{
fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n");
exit(0);
}
/*An den Drucker schreiben*/
printf("Sende Auftrag an den Drucker......\n");
fprintf(p, "%s", text);
fflush(p);
pclose(p);
}
int main()
{
char puffer[BUF], inhalt[BUF];
inhalt[0]='\0';
printf("Bitte schreiben sie Ihren Text den sie Drucken wollen"
" (Beenden : STRG+D)!\n-> ");
while(fgets(puffer,BUF,stdin) != NULL){
strcat(inhalt,puffer);
printf("-> ");
}
an_den_drucker(inhalt);
return 0;
}
|
Natürlich können sie nun auch andere Texte mittels..........
echo Hallo Welt | ./printme
...senden. Was uns in unserem Programmbeispiel fehlt ist ein Filterprogramm, um die Druckerausgabe zu formatieren oder Beispielsweise nach Alphabet sortiert ausgibt. Etwa bei einer Dateiverwaltung.
/*Download:pprint1.c*/
#include <stdio.h>
#include <unistd.h>
#define BUF 8192
void an_den_drucker(char *text)
{
FILE *p;
/*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/
p=popen("lpr","w");
if(p == NULL)
{
fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n");
exit(0);
}
/*An den Drucker schreiben*/
printf("Sende Auftrag an den Drucker......\n");
fprintf(p, "%s", text);
fflush(p);
pclose(p);
}
void sortiere_ausgabe(char *text)
{
FILE *p;
p=popen("sort","w");
if(p == NULL)
{
fprintf(stderr,"Konnte keine Pipe zu \'sort\' erstellen!!\n");
exit(0);
}
printf("Drucke den Text sortiert aus.......\n");
fprintf(p, "%s", text);
an_den_drucker(text);
fflush(p);
pclose(p);
}
int main()
{
char puffer[BUF], inhalt[BUF];
inhalt[0]='\0';
printf("Bitte schreiben sie Ihren Text den sie Drucken wollen "
"(Beenden : STRG+D)!\n-> ");
while(fgets(puffer,BUF,stdin) != NULL){
strcat(inhalt,puffer);
printf("-> ");
}
an_den_drucker(inhalt);
sortiere_ausgabe(inhalt);
return 0;
}
|
Sie könnten das ganze Programm jetzt mit Filtern und Schaltern weiterstricken.
Zum Schluss wollen wir noch unser Programm zum Versenden von Emails mittels sendmail
erweitern. Jede Mail die Versendet wird soll auf einen Drucker mitprotokoliert werden........
/*Download:pprint2.c*/
#include <unistd.h>
#include <stdio.h>
void an_den_drucker(char *);
int sendmail(char *, char *, char *, char *);
int sendmail(char *to, char *from, char *subject,
/*char *cc, char *bcc,*/ char *inhalt)
{
FILE *pipe,*pfad;
char pfad_sendmail[255];
char protokol[8192];
/*Wir ermitteln den Pfad zu sendmail*/
/*ACHTUNG!!! Sollte nur als root funktionieren*/
pfad=popen("which sendmail", "r");
if(pfad == NULL)
{
fprintf(stderr,"Konnte keine Pipe zu \'which\' erstellen!\n");
exit(0);
}
fscanf(pfad,"%s",pfad_sendmail);
pclose(pfad);
strcat(pfad_sendmail, " -n -oi -t");
/*Den Pfad ist meistens /usr/sbin/sendmail */
pipe=popen(pfad_sendmail, "w");
if(pipe == NULL)
{
fprintf(stderr, "Konnte keine Verbindung zu sendmail aufbauen!n");
exit(0);
}
/*In sendmail schreiben..........*/
fprintf(pipe, "To : %s"
"From : %s"
"Subject : %s"
/*"Cc : %s\n" */
/*"Bcc : %s\n"*/
"%s",to,from,subject,inhalt);
fflush(pipe);
pclose(pipe);
printf("Mail wurde erfolgreich an versendet an : %s\n",to);
sprintf(protokol, "To : %s"
"From : %s"
"Subject : %s"
/*"Cc : %s\n" */
/*"Bcc : %s\n"*/
"%s",to,from,subject,inhalt);
an_den_drucker(protokol);
return 0;
}
void an_den_drucker(char *text)
{
FILE *p;
/*Pipe zum Tool lpr erstellen zum Schreiben auf lpr*/
p=popen("lpr","w");
if(p == NULL)
{
fprintf(stderr,"Konnte keine Pipe zu \'lpr\' erstellen!!\n");
exit(0);
}
/*An den Drucker schreiben*/
printf("Sende Auftrag an den Drucker......\n");
fprintf(p, "%s", text);
fflush(p);
pclose(p);
}
int main(int argc, char **argv)
{
char to[255],fr[255],sub[255],inhalt[8192],puffer[255];
printf("Mail To : ");
fgets(to,255,stdin);
printf("Mail from : ");
fgets(fr,255,stdin);
printf("Betreff : ");
fgets(sub,255,stdin);
inhalt[0]='\0';
printf("Inhalt (beenden mit STRG+D) \n>");
while(fgets(puffer,8192,stdin) != NULL) {
strcat(inhalt,puffer);
printf(">");
}
sendmail(to,fr,sub,inhalt);
return 0;
}
|
Sie sehen schon mit den Pipes könnten wir praktisch jedes beliebige Programm einhängen.
Voraussetzung ist natürlich das bei dem Endanwender diese Programm ebenso installiert ist.
In den nächsten Kapiteln werdne sie sehen, wie wir eine Art Faxemfangsprogramm erstellen mit FIFO's.
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|