code:seek - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- seek 的系统调用函数
- 移动 指定文件 的偏移指针
- 使用3个隐式参数 : fildes, offset, ptrname
- 0,1,2 为 字节模式
- 3,4,5 为 块模式
- 0 : p0(无符号数) = offset
- 1 : p1 = now + offset
- 2 : p2 = size + offset
- 3 : p3(无符号数) = p0 * 512
- 4 : p4 = p1 * 512
- 5 : p5 = p2 * 512
5857
5858 /*
5859 * seek system call
5860 */
5861 seek()
5862 {
5863 int n[2];
5864 register *fp, t;
5865
5867 if(fp == NULL)
5868 return;
5869 if(fp->f_flag&FPIPE) {
- fp ← 根据 fildes 得到对应的 file结构
5870 u.u_error = ESPIPE;
5871 return;
5872 }
5873 t = u.u_arg[1];
5874 if(t > 2) {
- t ← ptrname
5875 n[1] = u.u_arg[0]<<9;
5876 n[0] = u.u_arg[0]>>7;
5877 if(t == 3)
5878 n[0] =& 0777;
5879 } else {
- t = 3,4,5 ,n = u.u_arg[0] * 512
- t = 3 时,清R[0]的最高位(即符号位),因为R[0]表示的是无符号数
5880 n[1] = u.u_arg[0];
5881 n[0] = 0;
5882 if(t!=0 && n[1]<0)
5883 n[0] = -1;
5884 }
- t=0,1,2 ,n = u.u_arg[0]
- t=1,2 ,若为负数,将负数扩展到双字
5885 switch(t) {
5886
5887 case 1:
5888 case 4:
5889 n[0] =+ fp->f_offset[0];
5890 dpadd(n, fp->f_offset[1]);
5891 break;
5892n = n + now
- t=1,4
5893 default:
5894 n[0] =+ fp->f_inode->i_size0&0377;
5895 dpadd(n, fp->f_inode->i_size1);
5896n = n + size
- t=2,5
5897 case 0:
5898 case 3:
5899 ;
5900 }无操作
- t=0,3
5901 fp->f_offset[1] = n[1];
5902 fp->f_offset[0] = n[0];
5903 }
5904 /* ------------------------- */
- (seek = 19.)
- (file descriptor in r0)
- sys seek; offset; ptrname