Mesaje recente

Members
Stats
  • Total Posts: 17,786
  • Total Topics: 1,234
  • Online today: 340
  • Online ever: 340
  • (Today at 00:10)
Users Online
Users: 0
Guests: 142
Total: 142

Redirectionarea in UNIX

Started by BiThian, 16 November 2006, 23:56

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

BiThian

Quote from: un alt forum
Here's what I found in C Primer Plus about redirection:
Quote
The < symbol is a Unix and Linux (and DOS) redirection operator. It causes the words file to be associated with the stdin stream.
So, I understood that < works with streams aka an interface(provided by C) to files.
However, I tried the command:

./a.out 0 < /etc/motd


and the redirection did take place, but in my example 0 is a file descriptor( the low-level equivalent to C stream).
The question is: why "<" worked with the file descriptor too?
PS: Scuze pentru romgleza.  :D
"A man who would not die for something is not fit to live." - Martin Luther King

kman

Poate te ajuta articolul asta.
Ideea e ca in UNIX poti avea acces la orice file descriptor deschis de o aplicatie (in cazul particular al linux-ului poti face asta cu ajutorul /proc), de aceea shell-ul suporta lucrul cu orice file descriptor pentru redirect.
Sunt curios daca asta merge si pe alte sisteme de tip UNIX in afara de linux, la ora asta nu prea mai am chef sa verific.

BiThian

Eu nu intelegeam cum poti accesa file descriptorii, cand redirectionarea lucreaza _doar_ cu stream-uri, crezand ca acestea din urma n-au nici o legatura cu file descriptorii. Ei bine, m-am inselat. :)
"A man who would not die for something is not fit to live." - Martin Luther King

kman

Revin cu o confirmare, se pare ca acesta este comportamentul standard POSIX (am reusit azi sa testez si pe un HP-UX 11i) si nu tine de faptul ca poti deschide filedescriptorii unui program cu ajutorul interfetei /proc/<pid>/fd/<fd_nr>.

Pentru validare, poti folosi urmatorul programel.

Code (c) Select
#include <stdio.h>
#include <unistd.h>

int main() {
        char a[1000];
        ssize_t l;
        l = read(4, a, 999);
        a[l] = 0;
        fprintf(stdout, "%s\n", a);
        return 0;
}


Daca il executi cu ./a.out 4</etc/hosts vei vedea ca se afiseaza continutul fisierului /etc/hosts.

File descriptorii sunt de fapt un caz mai general de stream-uri, iar redirectionarea lucreaza cu filedescriptori (la nivel de kernel) si nu cu stream-uri (care sunt implementate la nivel de libc).
Pentru mai multe detalii iti recomand sa citesti paginile de manual pentru functiile pipe, dup si dup2.

BiThian

Quote from: kman on 17 November 2006, 20:07
File descriptorii sunt de fapt un caz mai general de stream-uri, iar redirectionarea lucreaza cu filedescriptori (la nivel de kernel) si nu cu stream-uri (care sunt implementate la nivel de libc).
Pentru mai multe detalii iti recomand sa citesti paginile de manual pentru functiile pipe, dup si dup2.
Sa inteleg ca stdin, stdout si stderr de mai jos nu sunt C stream-uri?
Quote
A typical UNIX program will open three files when it starts.  These files are: 

    - standard input (also known as stdin)
    - standard output (also known as stdout)
    - standard error (also known as stderr)

Standard input has a file descriptor of 0, standard output uses 1, and the number 2 is used by standard error
"A man who would not die for something is not fit to live." - Martin Luther King

kman

Quote from: BiThian on 17 November 2006, 21:17
Sa inteleg ca stdin, stdout si stderr de mai jos nu sunt C stream-uri?
Ceea ce tu vezi in program ca std[in|out|err] sunt C-stream-uri, dar C-stream-urile sunt reprezentarile la nivel inalt al filedescriptor-ilor.

BiThian

Asadar, la nivel de shell se lucreaza numai cu file descriptori (care in C pot fi priviti si ca stream-uri)? Am inteles bine?
"A man who would not die for something is not fit to live." - Martin Luther King

kman

Da, corect.
Motivul principal este ca filedescriptorii sunt structuri mult mai generice care sunt puse direct la dispozitie de catre kernel si ofera o mai mare flexibilitate decat stream-urile.

BiThian

"A man who would not die for something is not fit to live." - Martin Luther King