पर लिखें मैं एक फोर्टो 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
के साथ एक रिकॉर्ड संख्या निर्दिष्ट करने से बचने के बजाय।
'gfortran-4.6.3' का उपयोग करके मुझे वही व्यवहार मिलता है। 'gfortran-4.1.2' 'अवैध मांग 'के साथ विफल रहता है, यानी पहले एक सिस्कोल। 'gfortran-4.2.4' वास्तव में इरादे के रूप में काम करता प्रतीत होता है, लेकिन मेरे वास्तविक अनुप्रयोग में कोड का समर्थन नहीं करेगा। जब आप कोई बग सबमिट करते हैं, तो मुझे अपना यूआरएल बताएं ताकि मैं भी सब्सक्राइब कर सकूं। – MvG
यह 'gfortran' 4.6.1 के साथ काम करता है। वास्तव में यह जांचने के लिए बहुत आलसी था कि कौन सा टैग r180701 संबंधित है और केवल यह माना जाता है कि मामूली संस्करणों के बीच कोई बड़ा बदलाव नहीं किया जाता है। –
@ एमवीजी, मैंने पुरानी बग पर एक नई टिप्पणी की। चलो देखते हैं कि क्या होगा। –