#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int val;
if(argc!=2)
{
printf("Usage: %s <descriptor> \n", argv[0]);
exit(1);
}
val=fcntl(atoi(argv[1]), F_GETFL, 0);
switch(val & O_ACCMODE)
{
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
printf("unknown access mode");
}
if(val & O_APPEND)
printf(", append");
if(val & O_NONBLOCK)
printf(", nonblocking");
if(val & O_SYNC)
printf(", synchronous writes");
putchar('\n');
exit(0);
}
Ich habe diesen Code. Wie auch immer, die Quelle ist vollständig verständlich.
Aber ich habe mit diesem Programm mit Kommandozeilenargument mit Umleitung verwechselt.
Mit diesem Programm und Ergebnis sind folgende
$ ./a.out 0 < /dev/tty
read only
$ ./a.out 1 > temp.foo
$ cat temp.foo
write only
$ ./a.out 2 2>>temp.foo
write only, append
$ ./a.out 5 5<>temp.foo
read write
Ich weiß, wie man umleitet, aber die Verwendung dieser Technik mit Befehlszeilenargumenten ist so verwirrend. Ich weiß nichts.
Meines Wissens erhält dieses Programm 1 Argument, das die Nummer des Dateideskriptors ist.
Also, wenn ich dieses Programm gerne benutze
$ ./a.out 0
read write
$ ./a.out 1
read write
$ ./a.out 2
read write
Das ist in Ordnung. stdin, stdout, stderr dateistatus ist read write.
Aber wenn ich diesen Befehl mit umleiten. Ich weiß nicht, was der Mechanismus tut.
Zum Beispiel:
./a.out 0 < /dev/tty
Hier ist die /dev/ttyDatei jetzt die gleiche wie die Standardeingabe, also bedeutet 0 /dev/ttyimmerhin?
Und was ist der Unterschied zwischen &2, &1und 2, 1wenn wir Umleiten verwenden?