2013-10-29 25 views
0

這是我的一個未解決的考題。 兩個Unix進程可以同時寫入單個文件中的不同位置 嗎?兩個Unix進程可以同時寫入單個文件中的不同位置嗎?

  1. 是,這兩個過程都會有自己的文件表項
  2. 沒有,共享i節點包含了一個偏移指針
  3. 只有一個進程將有寫權限
  4. 是的,但只如果我們經營使用NFS
+0

這是一個家庭作業/測試問題,不是嗎? – PaulProgrammer

+0

@PaulProgrammer是tbh。 – Disasterkid

+2

這是一條提示,其中三條回覆不正確。 – jlliagre

回答

1
  • inode中沒有記錄偏移,所以回答2不正確。
  • 進程沒有修改其訪問權限的記錄原因,因此3.不正確。
  • NFS允許不同主機上的進程同時訪問,這裏的問題是針對同一主機上的進程,因此NFS不應有所作爲。

這裏是一個shell腳本演示剩下的答案1.正確的是:

# create a 10m file 
dd if=/dev/zero of=/var/tmp/file bs=1024k count=10 

# create two 1 MB files 
cd /tmp 
printf "aaaaaaaa" > aa 
printf "bbbbbbbb" > bb 
i=0 
while [ $i -lt 17 ]; do 
    cat aa aa > aa.new && mv aa.new aa 
    cat bb bb > bb.new && mv bb.new bb 
    i=$((i+1)) 
done 

ls -lG /var/tmp/file /tmp/aa /tmp/bb 

# launch 10 processes that will write at different locations in the same file. 
# Uses dd notrunc option for the file not to be truncated 
# Uses GNU dd fdatasync option for unbuffered writes 

i=0 
while [ $i -lt 5 ]; do 
    (
    dd if=/tmp/aa of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2)) 2>/dev/null & 
    dd if=/tmp/bb of=/var/tmp/file conv=notrunc,fdatasync bs=1024k count=1 seek=$((i*2+1)) 2>/dev/null & 
) & 
    i=$((i+1)) 
done 

# Check concurrency 
printf "\n%d processes are currently writing to /var/tmp/file\n" "$(fuser /var/tmp/file 2>/dev/null | wc -w)" 

# Wait for write completion and check file contents 
wait 
printf "/var/tmp/file contains:\n" 
od -c /var/tmp/file 

它的輸出顯示成功,同時10個過程寫同樣的文件:

-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/aa 
-rw-r--r-- 1 jlliagre 1048576 oct. 30 08:25 /tmp/bb 
-rw-r--r-- 1 jlliagre 10485760 oct. 30 08:25 /var/tmp/file 

10 processes are currently writing to /var/tmp/file 

/var/tmp/file contains: 
0000000 a a a a a a a a a a a a a a a a 
* 
4000000 b b b b b b b b b b b b b b b b 
* 
10000000 a a a a a a a a a a a a a a a a 
* 
14000000 b b b b b b b b b b b b b b b b 
* 
20000000 a a a a a a a a a a a a a a a a 
* 
24000000 b b b b b b b b b b b b b b b b 
* 
30000000 a a a a a a a a a a a a a a a a 
* 
34000000 b b b b b b b b b b b b b b b b 
* 
40000000 a a a a a a a a a a a a a a a a 
* 
44000000 b b b b b b b b b b b b b b b b 
* 
50000000 
1

是的,他們當然可以,有以下注意事項:

  • 根據open()模式,一個過程可以很容易地擦拭文件內容
  • 根據日程安排,寫操作的順序不確定性
  • 沒有強制的鎖定(一般) - 精心設計要求諮詢鎖定。
  • 如果他們使用緩衝I/O寫入相同區域,結果可能不確定。
1

定義

是的,這兩個進程將有自己的文件表條目。

如果使用open函數打開文件兩次,則會創建兩個文件描述符。

每個文件描述符都有單獨的文件狀態標誌。

所以兩個文件描述符都有一個寫權限文件描述符1和文件描述符2的起始位置指向第一個字符到文件。

如果我們在描述符和寫入文件中指定了一些位置,可以很容易地進行測試。

file.txt的內容

我叫Chandru。這是一個空文件。

編碼來進行測試:

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


main() 
{ 
    int fd1, fd2; 

if((fd1=open("file.txt", O_WRONLY)) <0){ 
      perror("Error"); 
      exit(0); 
    } 
    if((fd2=open("file.txt", O_WRONLY)) < 0) { 
      perror("Error"); 
      exit(0); 
    } 
    if(lseek(fd1,20,SEEK_SET) != 20) 
    { 
      printf("Cannot seek\n"); 
      exit(0); 
    } 
    if(write(fd1,"testing",7) != 7) 
    { 
      printf("Error write\n"); 
      exit(0); 
    } 
    if(lseek(fd2,10,SEEK_SET) != 10) 
    { 
      printf("Cannot seek\n"); 
      exit(0); 
    } 
    if(write(fd2,"condition",9) != 9) 
    { 
      printf("Error write\n"); 
      exit(0); 
    } 
    } 

輸出: 後,我的輸出是

我的名字isconditionitesting空文件。

+0

雖然您顯示同一個文件的多個文件描述符可以同時存在,這確實是主要問題,但您並沒有真正回答關於寫入同一文件的兩個不同進程的問題,而不是單個進程。 – jlliagre

相關問題