मान लें कि फ़ाइल Foo.txt
फ़ाइल की सामग्री निम्नानुसार है।गोलांग में फ़ाइल पढ़ने पर मैं फाइल सिस्टम कैश को कैसे छोड़ूं?
Foo Bar Bar Foo
निम्नलिखित लघु कार्यक्रम पर विचार करें।
package main
import "syscall"
import "fmt"
func main() {
fd, err := syscall.Open("Foo.txt", syscall.O_RDONLY, 0)
if err != nil {
fmt.Println("Failed on open: ", err)
}
data := make([]byte, 100)
_, err = syscall.Read(fd, data)
if err != nil {
fmt.Println("Failed on read: ", err)
}
syscall.Close(fd)
}
जब हम कार्यक्रम ऊपर चलाते हैं, हम जो सही व्यवहार है कोई त्रुटि हो,।
अब, मैं निम्नलिखित होने के लिए syscall.Open
लाइन को संशोधित करता हूं।
fd, err := syscall.Open("Foo.txt", syscall.O_RDONLY | syscall.O_SYNC | syscall.O_DIRECT, 0)
जब मैं प्रोग्राम को फिर से चलाता हूं, तो मुझे निम्न (अवांछनीय) आउटपुट मिलता है।
Failed on read: invalid argument
कैसे मैं सही ढंग से झंडे syscall.O_SYNC
और syscall.O_DIRECT
के रूप में फाइल सिस्टम कैश लंघन के लिए open
man page द्वारा निर्दिष्ट पारित कर सकते हैं?
ध्यान दें कि मैं syscall
फ़ाइल इंटरफ़ेस का उपयोग कर रहा सीधे os
फ़ाइल इंटरफेस के बजाय क्योंकि मैं os
द्वारा प्रदान कार्यों में उन झंडे पारित करने के लिए एक तरह से नहीं मिल सकता है, लेकिन मैं समाधान है कि os
प्रदान की है कि उपयोग करने के लिए खुला रहा हूँ वे पढ़ने पर फाइल सिस्टम कैश को अक्षम करने के लिए सही तरीके से काम करते हैं।
ध्यान दें कि मैं Ubuntu 14.04
पर ext4
पर अपने फाइल सिस्टम के रूप में चल रहा हूं।
अद्यतन: मैं नीचे दिए गए कोड में @Nick क्रेग-लकड़ी के पैकेज का उपयोग करने की कोशिश की।
package main
import "io"
import "github.com/ncw/directio"
import "os"
import "fmt"
func main() {
in, err := directio.OpenFile("Foo.txt", os.O_RDONLY, 0666)
if err != nil {
fmt.Println("Error on open: ", err)
}
block := directio.AlignedBlock(directio.BlockSize)
_, err = io.ReadFull(in, block)
if err != nil {
fmt.Println("Error on read: ", err)
}
}
उत्पादन निम्नलिखित
Error on read: unexpected EOF
आप खुले-पढ़ने के करीबी लोगों के साथ सटीक करने की कोशिश की है जाने से कुछ और में तर्क (सी शायद)? मैं मैन पेज पर जो देख सकता हूं, उससे O_SYNC केवल लेखन कार्यों को प्रभावित करता है और O_DIRECT को उपयोगकर्ता स्पेस में किसी प्रकार का सटीक आकार (?) बफर चाहिए, यह एक विशिष्ट समस्या हो सकती है, लेकिन मैं पहले उस काम को प्राप्त करने का प्रयास करूंगा सी में ... – mrd0ll4r
@ mrd0ll4r, असल में मैंने [इस कार्यक्रम] भाग लिया (http://man7.org/tlpi/code/online/book/filebuff/direct_read.c.html) और उसी त्रुटि को 'EINVAL' मिला सी पक्ष। तो नहीं, यह विशिष्ट नहीं है। – merlin2011