Aşağıdaki işlevselliğe sahip bir program veya işlev yazın:
- Program / işlev önce dizeyi
Hello, world!
standart çıktı akışına yazmaya çalışır . (Odak, programın kendisinin önemsiz davranışından çok G / Ç üzerinde olduğundan, bu zorluk için başka hiçbir çıktı biçimi kabul edilemez.) Başarılı olup olmadığına bağlı olarak:- Çıktı almada başarılı olursa
Hello, world!
, program / işlev başka bir davranış olmadan çıkar. - Bir hata nedeniyle doğru çıktıyı üretemezse, program / işlev dizeyi
Error writing "Hello, world!"
standart hata akışına yazmaya çalışır . (Bu zorluğun amaçları doğrultusunda, hata işlemenin kendisi için hata işlemeye ihtiyacınız yoktur.)
- Çıktı almada başarılı olursa
Açıklamalar
Programınız / işleviniz giriş olmadan çalıştırılacaktır (kesinlikle çalışması için giriş gerektiren bir dilde yazılmadığı sürece, bu durumda mümkün olan en basit girişle çalıştırılacaktır).
Çıktı üretirken, isterseniz tek bir sondaki yeni satır da üretebilirsiniz, ancak bunu yapmak zorunlu değildir.
Programınızın uyguladığı "standart çıktıya yazma hatası" tanımı, en azından aşağıdaki durumları hata olarak ele almalıdır:
- Standart çıktı yok (örn.
stdout
Kapalı bir dosya tanıtıcısı, dosya tanımlayıcısı 1 yok veya bu durumlar kullandığınız dil ve işletim sistemine çevriliyor); - Diskte boş alan kalmamış bir dosyaya gönderme yapan standart çıktı;
- Bağlantının sonunu zaten kapatmış olan başka bir programa bağlanan standart çıkış.
ve en azından aşağıdaki durumları başarı olarak ele almalıdır (yani bir hata değil):
- Standart çıkış bir terminale bağlanır ve
Hello, world!
ekranda görüntülenir. - Standart çıktı bir dosyaya bağlanır ve dosyaya
Hello, world!
yazılır.
Yukarıdaki kurallarla tutarlı olduğu sürece, çıkış hatası olarak sayılanların ayrıntılarını seçebilirsiniz.
- Standart çıktı yok (örn.
Programınız / işleviniz, yukarıda listelenen hata durumlarıyla karşılaştığında çökmemelidir. Hangi çıkış kodunu kullandığınıza bağlı.
Programınız / işleviniz, standart hata akışında karşılaşılan hatanın niteliğini tanımlamamalıdır; sadece yukarıda belirtilen dizeyi yazdırmalıdır. Standart hatada harici çıktı (örneğin derleyici uyarıları) yalnızca bir hatayla karşılaşılıp karşılaşılmadığına bakılmaksızın koşulsuz olarak üretilmesi durumunda yasaldır.
Programınızın yalnızca bir işletim sistemi üzerinde çalışması gerekir (yukarıda listelenen hataların mantıklı olduğu bir sistem olsa da; Çoğu çok görevli tüketici işletim sistemlerinde çalışacak kadar genel tutmaya çalıştım, ancak garip işletim sistemleri iyi olabilir bu zorluğun dışındadır). Programınız taşınamıyorsa, başvurunuzun başlığında çalışması gereken varsayımları listeleyin.
Bu görev her dilde mümkün olmayabilir (her dil bir programın çıktı hatalarını özel bir şekilde işlemesine izin vermez). Mümkün olan yerlerde bir dil seçmeniz gerekecek.
Programınızın / fonksiyonunuzun çalıştığından emin olun! Sadece kütüphane fonksiyonlarının dokümantasyonuna, söylediklerini yapmak için güvenmeyin. Basit çıktı fonksiyonlarının hata yönetimi, fonksiyonlar teoride hataları ele aldığını iddia etseler bile pratikte kırılır.
Test senaryoları
bash
Linux'ta yukarıdaki hata koşullarının her birini simüle etmenin bir yolu (Linux kullanmak zorunda değilsiniz, ancak muhtemelen bunu test etmek için en kolay sistemdir):
your_program_here >&- # nonexistent stdout
your_program_here > /dev/full # out of disk space
mkfifo test # note: change "test" to a filename that isn't in use
true < test &
your_program_here > test # connecting to a program that doesn't want input
rm test # clean up the FIFO we used earlier
İlk iki testis belirleyicidir. Sonuncusu (bir yarış durumuna dayanır); test amacıyla, yarış durumunun hatayı ortaya çıkaracak şekilde çözülmesini sağlamak için programınızın başlangıcı ile gerçek çıktı arasında bir gecikme eklemenizi öneririm.
Zafer koşulu
Bu bir kod golfmeydan okuma, çok daha kısa daha iyidir. Her zaman olduğu gibi, programın uzunluğunu bayt cinsinden ölçüyoruz.
sleep 1 < test; (sleep 2; your_program_here) > test
misiniz?