2012-08-02 27 views
8

पर लिखें मैं एक फोर्टो 9 0 एप्लिकेशन को फीफो खोलने और प्रारूपित डेटा लिखने की कोशिश कर रहा हूं। मैंने इसे कम से कम उदाहरण में छीन लिया है। foo.f90 निम्नलिखित कार्यक्रम होने दो:फीफो (नामित पाइप)

program foo 
    open(1,file='fifo',position='asis',action='write') 
    write(1,*)'Hello, world!' 
    write(1,*)'Goodbye.' 
end program 

अब संकलन और कार्यक्रम चलाने:

$ gfortran-4.7.1 -o foo foo.f90 
$ rm -f fifo 
$ ./foo 
$ cat fifo 
Hello, world! 
$ rm -f fifo 
$ mkfifo fifo 
$ cat fifo > bar & 
[1] 6115 
$ strace -o foo.st ./foo 
At line 3 of file foo.f90 (unit = 1, file = 'fifo') 
Fortran runtime error: Invalid argument 
[1]+ Done     cat fifo > bar 
$ tail foo.st 
write(3, " Hello, world!\n", 15)  = 15 
lseek(3, 0, SEEK_CUR)     = -1 ESPIPE (Illegal seek) 
ftruncate(3, 18446744073709551615)  = -1 EINVAL (Invalid argument) 
write(2, "At line 3 of file foo.f90 (unit "..., 52) = 52 
write(2, "Fortran runtime error: ", 23) = 23 
write(2, "Invalid argument", 16)  = 16 
write(2, "\n", 1)      = 1 
close(3)        = 0 
exit_group(2)       = ? 
+++ exited with 2 +++ 

तो कार्यक्रम काफी अच्छी तरह से काम करता है जब एक सामान्य फाइल करने के लिए लेखन। हालांकि, जब फीफो को लिखते हैं, तो यह पहले लिखने के बाद फ़ाइल आकार को बदलने का प्रयास करता है, ऐसा करने में विफल होने के बाद एप्लिकेशन को समाप्त कर देता है।

मैं फोरट्रान के लिए काफी नया हूं, इसलिए मुझे यकीन नहीं है कि यह गोरफ्रान में एक बग है या क्या फ़ाइल खोलने का कोई तरीका है जो इस ftruncate syscall को दबाएगा। मैं स्वरूपित अनुक्रमिक दृष्टिकोण के साथ रहना पसंद करूंगा: मेरी रेखाओं की अलग-अलग लंबाई होती है, और मैं प्रत्येक write के साथ एक रिकॉर्ड संख्या निर्दिष्ट करने से बचने के बजाय।

उत्तर

4

यह एक old featurelibgfortran में है कि संस्करणों पहले समझौता किया गया था लेकिन SVN revision 180701 में जीसीसी 4.7 शाखा के लिए पुनः शुरू किया गया, और अधिक विशेष (यहां तक ​​कि यह एक बग! लगता करने की हिम्मत नहीं है) है। स्पष्ट रूप से डेवलपर्स नामित पाइप के साथ अपने आई/ओ कोड का परीक्षण नहीं करते हैं।

आपको पुराने gfortran संस्करण (4.6.1 के साथ काम करता है) या किसी अन्य विक्रेता से अन्य फोरट्रान कंपाइलर का उपयोग करना चाहिए। मैं जीसीसी को एक बग रिपोर्ट जमा करूंगा।

+1

'gfortran-4.6.3' का उपयोग करके मुझे वही व्यवहार मिलता है। 'gfortran-4.1.2' 'अवैध मांग 'के साथ विफल रहता है, यानी पहले एक सिस्कोल। 'gfortran-4.2.4' वास्तव में इरादे के रूप में काम करता प्रतीत होता है, लेकिन मेरे वास्तविक अनुप्रयोग में कोड का समर्थन नहीं करेगा। जब आप कोई बग सबमिट करते हैं, तो मुझे अपना यूआरएल बताएं ताकि मैं भी सब्सक्राइब कर सकूं। – MvG

+1

यह 'gfortran' 4.6.1 के साथ काम करता है। वास्तव में यह जांचने के लिए बहुत आलसी था कि कौन सा टैग r180701 संबंधित है और केवल यह माना जाता है कि मामूली संस्करणों के बीच कोई बड़ा बदलाव नहीं किया जाता है। –

+0

@ एमवीजी, मैंने पुरानी बग पर एक नई टिप्पणी की। चलो देखते हैं कि क्या होगा। –