A következo program bemutatja a loopback driver használatát, és az egyes
ioctl hívások eredményét is lehet vele tesztelni.
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stropts.h>
/* Loopback driverben is definialt konstansok */
#define I_NOARG 65
#define I_ERRNAK 66
#define I_ERROR 67
#define I_SETHANG 68
#define IOBS 1024
struct strioctl ioc; /* Ide kerulnek az ioctl hivas opcioi */
main()
{
int fd, work;
char buf[IOBS];
if ((fd=open("/dev/lpbk", O_RDWR, 0777)) == -1) {
perror("nem tudtam megnyitni a device drivert\n");
exit(1);
}
printf("Milyen szoveget kuldjek el a loopback drivernek?");
if ((fgets(buf,IOBS,stdin)) == NULL) {
perror("fgets failed");
exit(1);
}
/* devicera iras es onnan olvasas */
lp_wrt(fd,buf);
lp_read(fd);
/* Device ioctl teszt */
ioc.ic_cmd = I_ERRNAK;
ioc.ic_timout = 0;
ioc.ic_len = 0;
ioc.ic_dp = NULL;
if ((work = ioctl(fd,I_STR,&ioc)) < 0) {
perror("Ioctl rendszerhivas sikertelen");
}
printf("Visszateresi ertek ioctl rendszerhivasbol: %d\n",work);
lp_wrt(fd,buf);
lp_read(fd);
close(fd);
}
lp_wrt(fd, s)
int fd;
char *mit;
{
if (write(fd,mit,IOBS) < 0) {
perror("Hiba a wite rendszerhivasnal");
exit(1);
}
}
lp_read(fd)
int fd;
{
char retbuf[IOBS];
if (read(fd,retbuf,IOBS) < 0) {
perror("Hiba a read rendszerhivasnal");
exit(1);
}
printf("A beolvasott szoveg:%s\n",retbuf);
}
Megjegyzés: ne becsüljük le a loopback driver lehetoségeit!
Ezzel lehetoség nyílik például arra, hogy egy exec rendszerhívás
végrehajtása elott a rá elküldött adatokat az exec
rendszerhívással végrehajtott új program megkapja. (Ez azon múlik, hogy
az exec nem zár le minden filedeszkriptort automatikusan, és a
STREAMS rendszer teljes egészében a UNIX kernelen belül helyezkedik el.)
A STREAMS-nek ezt a tulajdonságát használták ki akkor, amikor az ATT
UNIX System V rendszeren a Berkeley sockets-eket implementálták.
(STREAMS alapú device driverek fejlesztésénél ez a driver és a korábban
bemutatott "debug"
modul nagyon nagy segítség!)