Program çıktı yönlendirmesi


11

Program çıktısını "bir sayıdan büyük" sözdizimi (örn. foo 2> myfile) İle yönlendirmeye çalışırken , burada olası sayılar nelerdir ve neyi temsil ederler?

1 olduğuna inanıyorum /dev/stdout, 2 /dev/stderr. 5 ve 6'ya ne dersiniz? 3, 4 veya 6'dan büyük bir sayı var mı?


Yanıtlar:


11

Bu sözde program belirttiğiniz dosya tanımlayıcı numarasına yazacaktır. aşağıdaki merhaba dünya programını düşünün:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

derle

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

şimdi basit bir koşu

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

5 için dosya yok, bu yüzden hiçbir bayt yazdı.

sonraki deneme:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

Bir dosya ve dosya tanımlayıcı (örn. 5>u) Belirtirken çıktı almayı başardım .

Pratikte, yukarıdaki gibi komik bir program yazmadıkça, kullanarak veri toplamanız olası değildir 5>foo.

kabuk betiğinde <() kullanarak yapı daha kullanışlıdır:

 diff <( cmd -par 1 ) <(cmd -par 2)

write()döner ssize_t, değil int.
Andrew Henle

Sorunun ana noktası bu değil, printf işlevi için de bir geri dönüş var.
Archemar

Döndürülen bir değeri kullanmamak, yanlış türü kullanmaktan çok farklıdır .
Andrew Henle

düzenlenmiş ben çıktı hiçbir değişiklik görmüyorum ...
Archemar

10

Sayılar, dosya tanımlayıcılarını temsil eder (açılan dosyaları işler).

Kabuk genellikle otomatik olarak 3 sete sahiptir,

0 - stdin 1 - stdout 2 - stderr

Ancak başka dosyalar da açılabilir ve sayılar artabilir.


7

Bu sayılar dosya tanımlayıcılarıdır . Belirttiğiniz gibi, otomatik olarak oluşturulan birkaç tane var. Diğer dosyalar veya dosya benzeri şeyler açıldıkça, başka numaralar alırlar.

Herhangi bir programda kullanılan sayılar, o program tarafından açılmış veya başka bir şekilde kullanılmış olan dosyalara bağlıdır. Örneğin, geçerli stdin'i "kaydetmek" ve stdin'i geçici olarak başka bir yerden yeniden yönlendirmek ve daha sonra geri yüklemek istiyorsanız, şöyle bir şey yapabilirsiniz:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

Yani bu script 4en azından bir süreliğine bir dosya tanımlayıcıya sahip olacaktı . Bu 4, kullanılmayan herhangi bir şey olabilir (bir sürecin kaç dosyaya sahip olabileceğine dair bir sınır vardır, ancak bu sınır dahilindeki herhangi bir şey).

Bir işlemin hangi dosya tanımlayıcılarının açık olduğunu ve içeriye açık olduklarını görebilirsiniz /proc/<pid>/fd. Bu işlem için tüm açık dosya tanımlayıcılarını <pid>ve bunların ilişkili olduğu dosyaları gösterir.


0

Herhangi bir işlem tamsayıları dosya tanımlayıcıları olarak alır, burada POSIX'te üç ayrılmış olan vardır: 0 stdin, 1 stdout ve 2 stderr'dir. Diğer dosyalara başka numaralar atanacaktır. Bu program ile kolayca kontrol edebilir, fdtest.c olarak kaydedebilirsiniz , böylece çalışma sırasında kendi program kodunu açar:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

Derleyin:

gcc fdtest.c -o fdtest

Çalıştır:

./fdtest

Alacağınız çıktı şu şekildedir:

3

... değişken tarafından atıfta bulunulan dosyanın dosya tanımlayıcısı sayısıdır fd.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.