Verwenden von Befehlszeilenargumenten mit Umleitung


0
#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?

Antworten:


2

Ich weiß, wie man umleitet, aber die Verwendung dieser Technik mit Befehlszeilenargumenten ist so verwirrend. Ich weiß nichts.

Bitte beschreiben Sie genauer, was Sie genau verwirrt. Was mich betrifft, werden die Ergebnisse sehr erwartet: Wenn ein Dateiobjekt nur zum Lesen geöffnet wird (wie bei der <-Umleitung), gibt F_GETFL O_RDONLY aus. Dasselbe gilt für andere Umleitungstypen.

Ohne Umleitung erhält ein untergeordneter Befehl die gleichen Standardbeschreibungen wie der übergeordnete Befehl. In einem typischen interaktiven Fall ist es das Benutzerterminal, und alle Deskriptoren sind schreibgeschützt. Es ist zwecklos, sie schreibgeschützt oder schreibgeschützt zu machen, da es bequemer ist, denselben Deskriptor für interaktive Terminalaktivitäten (wie z. B. Vollbildaktivitäten mit curses) zu verwenden, als ihn für Terminaleingaben auf 0 (1) zu verteilen für Terminalausgabe usw .; Dies gilt jedoch nicht für benutzerdefinierte Umleitungen. Ist das das, was du gefragt hast?

Und was ist der Unterschied zwischen & 2, & 1 und 2, 1, wenn wir die Umleitung verwenden?

Wenn Sie Formen wie 2>1und meinen 2>&1, sind sie grundsätzlich verschieden. 2>1Leitet 2 als Schreiben in eine Datei um 1. 2>&1Leitet 2 als Kopie von Deskriptor 1 um (auf C-Ebene ist dies dup2(1,2)). Sowohl n<&mals auch n>&mfür numerisches n sind m identisch und schränken den Zugriffsmodus nicht ein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.