Linux下Io流

Linux下Io流

系统调用接口

系统调用函数open

第二个函数常用于文件未创建时,需要设置文件权限

参数:

  • Pathname: 要打开的文件名

  • Flags:

  • O_RDONLY: 只读打开

  • O_WRONLY: 只写打开

  • O_RDWR : 读,写打开 这三个常量,必须指定一个且只能指定一个

  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限

  • O_APPEND: 追加写

设置读写追加选项:O_CREAT(用在我们还未创建文件时,创建文件),O_WRONLY(只写),O_RDONLY(只读),O_RDWR(进行读写)

  • **mode:**文件权限 如0664。即为rw-rw-r–。

作用:flags方式打开目标文件

返回值:

1.创建成功返回文件的文件描述符fd

2.创建失败返回-1

注: 当我们在创建文件时,没有使用函数二去创建,文件的权限的就会呈现这样的模样,不需要创建文件时,就不需要去理会文件的权限即mode参数


write函数

参数:

  • fd: 文件描述符,可通过此fd找到所需要操作的文件
  • buf: 所需读取的数据的放置处
  • **count:**所需要读取的数据的字节数

作用: 将buf里面的最多count字节的数据写入到fd对应的os级别的缓冲区里

返回值:

1.成功,返回0

2.失败,返回-1

例:


read函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wkRutC4h-1683042181154)(data:image/png;base64,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)]

参数:

  • fd: 文件描述符,可通过此fd找到所需要操作的文件
  • Buf: 读取的数据的放置处
  • **Count:**所需要读取的数据的字节数

作用: 将buf里面最多count个数据拷贝到fd对应os的缓冲区里

返回值:

1.成功,返回0

2.失败,返回-1

例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cyVFHmXz-1683042181154)(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAV8AAACtCAIAAACY+utwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAACQISURBVHhe7Z1faBtZmujPXtwhbbkbJxNLYtY1dmzWCIIr3XNZFAdvmsayIWNoP7VgsBdk6NgPRg+5SRsaXE8KNLid2w/CC3EaLFibAefJDboGR6ZJ1sQRy/ZsywRMBjvxlhckORubjOQxaT3c809SSaoqlf7akr8fBaqqU+cc1Z/z1fd955yv/u6TTz5BOfznn/+Tr6nxyacqWc4wx/v/d+u/0d/b/k/Leb4HqCHeyX/a+R++rsJv/uUT4d/4ei1y/Me/bP1js+GHM+NqqEsHAACAv2ttbeWrAAAACv4X/wUAAMgEpAMAAOrklw5iZ4/c1zPVxDeriM098+g5Z2aQ78zG5sbHPHLb+OZph/zd2vm3wMlzkk9MBXUHKlb65q18s1AGZ3zDvWjRdY1y18931zQ2t2dYWPd5t/g2R7jV430s2vHagOh93DPUxXZXgaah+T5edZnRK7mU87UNpl8Zj2YGjbaawRmeh/Po0Yw7nTkj9RFOyy1Xs16eV/n6oruSO+iGavOmL7acJFZeurgtr29dGPaciHzILx1C2xvC2sa9GN+sFraONoTkp4+zGlJNM/jVsCAv/lAXgu5kwK8MqXfXQ18ZLs9ur+TTVCpVWPfQNw3G5XvaNpyVOZkq4TTJl6mt5q+311Vw+93ySosyymz5gzNSL/kryreh/4dFWRj+qoATLRfgd6geg5/31pu8qy42twtfQSxe6SXcIq2mmFaJ2fLTlqmaGad96VlHvVJKAOSvV5Zl4UZ/wX8kKR+SLZ9WRGti25ytx09xhZ9XXzzoSIemqZ4+bBrQJcvvQJN6Op1W8Qk7oEdUHGCdpzv97Y14w3ElWUhPp8jS9eGamm9YwCrosI9uZChuCh0Pq4edfK8xBPuB5N3z0kWSDuy4DoYQw/uloeOhsShL9SpTGUJsTOJ5M1KTee3JvNJYLCsroVjhIAyI0mOspZNFmhftmXq4MNA5RnR4usz3jA0YcxARlR5nsTtIf3bLSKr8W4rsXcqSDddrpOTisPXfEDKuIG01xbRKwtbOLj6LNvXnx//TOlYHeHs0UO/u06fFvd6J3YBropKI2p1YNkjZlif7r1riIdsUKSM60iF2b2NNWFsbfH3Ed2TR2D5hirrX1oTgiwBqGbeLTp4QHsU7kxkDL8g6WTa2QyxdH/9dqt+5sFDFV4q7HVJ+B2yrKXQ83+4NiUgRChcrKnDTThiKTo7EIwtWt7vV7baGUHxk8kBpGJsdbyy/XGSpgaxU+4F38tASujRNUxciuXnfWWne6QUT6j6cHDvmCUmIcEC7OwUKB2yiT37dEvku6O5fc/cHQ7i9zSqM+QFx8ut2y7MX0yR1zT26+cs/dWQ1Y3VWQ6zAwB7e2F9g2fvXPA+TFiRu5LOpkoMLe4brzVty0XS24VudcQV1W3gemOm6u803s9jexY9fWwd9bozUu0NaeVGvd/9drKgQ+TCjJRswyr9TRUqxLPZnt8OkwcfC30exIDB1lfx2yAux3JU6HtXMDHJ80/EeRZtXgg10s2HZ1xxF8YGhBN2kaKYmhgbiONW3fJ5W1xBcycm7+fEyzSsHPwpFEbIkVNQHDeSHG+7+UBCvkaa1sfyS7cZYbzob0d7rlVXWtGLL376OopaB5HtYaDMhdBR6Ek5ehFhQCgXT2YumaeiPLbhe30NWciz4r+WsV/t8q4VtkL6ncx3ESQqXO0TdKM7MoZYK6u3FD4zWHypFDJZACdLhKJ55Io2dFZcOua5KetkYXOlQ4UtyyYWEBTf/EGveFLkhgt/5lnQL10wVjkVzvrwRJlaSmH/9LV9j0L9eKF0m8p+fRdL1voyTen/Hr7S8G8fX3TFLLI6xW532csnnLovYehL1VpheiSuTz33SDaJ/lrUnrHjnIXM/ZDsjjcKe+4p06tW8V5LqXEXSENF7yWenmh1h7nQgy5tuvKsABUEhxkoiFsEae6uJ17samv5uP7qHzK0t3c72kVm711NsD3IOZqeduxXIcoWcb1XqrRypPguXZ13olfR6CfXtDnWoD+EknIcVo+alAzUKKXn9DjkkLGaEIg0a4iU7NRpgDgvF4mkqXjQVSZOlFaG9eKpeeTXkGSWG/fR3WPlH6Nrlcg2XiC4xZ4diGd2uQr2a5BrfxbRhwhY19vVGESh9Dcbr5dZFB98sH8WeaInUlnTIdRYbV9iZLSAep9/2zNZQWASaqfL5UDTDjiiCDDe4QZg+f92S/lfM1vgvFQ+fvLrtW1JzILNOhILe7S8jIawXJO0IfTTrLQUm6bOkes7dz+lMKABq7GsaAtSFvP4T09YLqJdaFzduGH0mDZPrGE2jeq3KQwWlQygS3UGow2w11JFpDHaj8D2ll4L7ljh5/A7o/ErgHDIf3rSzRp4Ych2akWl1WeEv0ExtWF41oe430lBSfAgJ+9DBmNIrmRcqHgr0O4dXcMNrbb/J+wubhr5pN6P91aT/3+4hXYn8L3VZf3+9EaF4uAAnX+znZ8SffDW7HzS2/Kd9dO2KdMuaLLzJfkscS3olDdSrVXIpUNVdcfeJi1rbsZgHZV9iBvipeiT1Kp0ABdRLHlBBSD2TZYK+A5PCqopoSgc2Djo5bKFx3M6HLRQwMjq27X69j1qu+Asa76DPlvdLbDSSsWwYn6vtqcd4p4W8bJ5eMFlGmPsgLCLTwvQF4jlPEg1cilx9y1IdWanBC+7pSxHx3STzO7jeXkUfriglS36IeCi0d15+uIEtfMvXzAVgF9H+wgT19lOC0uYvbR0u5hqYvSLuvVamGkF+uBl4jrp5+YpRCash98SLyPXLk6zwb7qvouhKUioZqVezZAMwjVDl7ey/q7j7Utu6x1WCN473FST7GZI+S48r12NpvF4mdLJJD9xJUcDLnuoqWsJB81qVAYjvwBBi0uQhClg9hTX4AiGjNYZ3PXUya6RyYGVZ6l2H68QgV6Nt0cU04Bwqea1q3itZU9Cuq+I6xc8SdFQpzEdhkNHVGmOkCBW9VqA7MKqjOwBALQHSgQHSoaah6jVfVwGMlOIA6QAAgDrgdwAAQB2QDgAAqAPSAQAAdfJLh65b0cePo7c0B9EnbnnwAXt0ORjgOxXoRc2srbiyemcCAPVHqbrDgCfsvIaWJlr7+/FyYZXvTqERZ5Vy6uLKik3OKfGJ3CfLfU9UgnCTYXAnFf8TAKpPfunw8qG5v9/8UH3wfqKNzBhsfKI1tF8vziqbd1aREaBFYZ33dt9EUffg6x2+J4fip/ADQO1RWb9DsaEUT4Tw6Gcbo/dotCtN6CywuprCDwCa6EiHxK155k3AS47fYeCA7g87se7Qejir7nfQEA5symmF4spWGBrEBcQDcCbIPxqq61Z01omWJlSNCyxBwk7UPDHapJKYZ34InZKEcmaX0N0CnQW3Redo07iyMjmuU3NEHEne+UovVWucei5i5xN/O3oQ/Ez1Gx4a/xoA6o/KWhZFUEpc2WpwQvE/AaD6VFA6GA/bpCDXVWk4rmy+6C8UbtUwKvINAACoFyooHcoVZ7WUuLIAABTNqbMscjEaV1Y/lZOhYBQzxIIpN1WP/wkA1aeS0qGYOKs5ET6LM1Aqh178TwCoKyqqOxQTZ7X4uLKG/A6lQmXVCcT/BIDqoykd6PQKMoph1vkeoffOWTaiYc+jMpVCk2LirJYSV7Y0nPNkDLXsb+9AqGPcTtblnqmMULm68T8BoL6odPQXOjygbuKskhEc2vE/AaC+qLRXsp7irOaJ/wkAdQZEjgMAQJ0a6NEEAOBEAOkAAIA6IB0AAFAHpAMAAOqAdAAAQB0j0oEEY2HRWCDmKgCcHQxIh8GvpF5hlwaHhWFAAHB2yC8d+KTEGgkOCQBAuQC/AwAA6oB0AABAnfzSIR18BQCAs0Q+6WAjUedr55sUAACUDe1ZWCxyPJYM8qLvSy9ENACAs0a+OZo2N/nYZWEfhAAAoB7IZ1lseUn0N/h+AwCcPfJ7JWnA+AKDQwIAUPtAjyYAAOqAdAAAQB2QDgAAqJNfOrDPyhYYdh4AgJrHgO7gv0u+KDFMvi8BM7gB4OwAMakBAFAH/A4AAKgD0gEAAHVAOgAAoA5IBwAA1Dm9XsnEkBR2oOZpT1P5P8EtxMZch91mur55yT13nq6lIfNTbzytn5lnXZ1j37R3sxv9/IVbCtM1IzQNzdsd6PX06HbqLtg9fSPX+DpCR4GJjeWXfKMoVKo4GertrpdOHeoOWKzseb0Hdr6Zy/HY5GE3ljvuVjdeckQDfko8w8K6L/shEW71eB+LpNgB0fu4Z6iL7T79WMdm27tx8+tfc+OlANGgTlCi5fSvTS8d8V1lp6tTetwn3Wrimwz7/IRX/oP2fc1Lnju45fWtC8Me6LVPcXqlQ8Oyp9VdEcUhYUEoGjqvVfLgV8OCvPhD3US06DKR830WKepKxpZH19wn/lZnBL//cxRdHphq4dvlx//DoiwMfzXIN8884HfIhgTDglhYp5LQs9UAMo//YwnqQx62Hj+VUe/nIB4YDfy3nAgxafIQBS6FLO8c3e/JnqhpwXchqHwB2Q+8I/HNhdY5dCCNxM34kM1Lvjn6PqfZmU8ARTP9DsmSVy3vRmjJ0c1m31zyAFomW0UoPuKNj9C1aMDqWSbnaR/bG+mmuzCOsNdBV7L8DlQ4LBYuHIQB0fV1C/vb0b391W9DQWaNYyV5th0tvQj97rLjWiPZs7e/kEplKP0CytRk3tXfXR6heaPPX/sko2/yDAeB0+510pW036HJfqtj4HqLmdd7tPmnzbnVGN3gVfO7sFe4U0DrjCiKa3W0ufQqQncaAqsPA45PsfoQvLfPdyURpoYnx1Hgzn9YJvq6O/COw80Hq3M5h+WBzhsg4sGvojsOzjyXetG659rdMxIqrWK6g9nxxvLLRWLYu60B3FYn1RwB1tjY1Q999JhV9O73LLyt3ORhuaJ0Mwez452Vljy9YELdh5NjxzwheIFXRzKaFsg6WZhoIOlzdM90M07HIoOlZvkdaBjN3Z0ChQM2aCe/bol8F6QGeTCEWkZmqX2bxOy8Yvm3TZYayErFNvBsu+XZC+oXCC7s5ea9bKV5p7/bR9faJz1WnpAP7iCYeE3Od4n9t7TfQbjVcRVFfdhwoPunn8W7v7anTf2X2x76fwJ7fEcB6J5RxrWaeBW5fsVRgF889JfQDjL3/4NGJORmx8TFX9yzbmFpIYC6x51jTCIWAIQzUVA5yyLavBJkzbJh2YcbZHxgKEE301hEtML0BdQQnLv4M92Zn82Pl2nJcvCjEH7wLYnqBM2WH264+0NBvLYacvcrHfXWm85G/IJd4S/e2PK3uEG2DCidapqpTUN/bMGpvodheh1iwX/Nyfv81TLNK6/uhHBbbTWV5Xzlh6E5XilBfriDBYH5d5mOwGLQP6PMa/UyTK9GAewvz75CHZ/e1Gj2m7PPsHDGhwW/f0WejS6lk0L7DqZhkw4hFhqlYtIhw+0nN2Dt0WzJlg4owzXYICs2dIhGMs0h86+/5WulQz/8VSi5br+XcXK+ipammdplEVvz5f2vpLbPaDWV6Xyb7J4e6XGfly928g4vXfTon5HGtcpGdSdn6d8DO6h74rraHz2MZGp95s7f8LVy4L97DXNWzApMlbySDRG1l3wknNnOTx765igDsYjeSz471ey0J5soXq4Q30iZFARtyCiDkWsoxK2hYo0IDQo5I3o11IjsZorFJHnUB6BsVEk6JCxmfLcb0m+MOqfJgt/De3GN881OTTsFUkulOxHZG35pk9ksFPqvykQhZ6Rab3iuf21ulW/ksLSziVD3zUo4B/hnY7f55tmmcl5J8Tj9rmBDDLIsglOJn4TgLrBLi2nO1y3p82X6s8Ii0Ex9GQmVx9ovmQFzqj+nJPTPiKXmXI1C2Vp5cIgc/3tI5Nvlg376TcMtPTjz/GwFOamc7mA+vGlnjobEkOvQjEyryb6DCtPwc+gcQr9e5bUXCBUPBfqswytLR6i1/eYAaxJNQ9+0m9H+6kOFYqyZGlv+0z66dkW6ZeUNpqvJfkscU3olKwFrpc4OOxsv2GUd+2PBg4zkJ9EoanT8c/Kfc/TPKPbzM8W16rLSq5GD6lhJJfK9/9hEzY7b5W6oVHVY/wk+7kSpnFcycCly9a3Xu+f1hh3ItDB9gfiK88PGQdNc+KkxH06Sdf2R0dnIyxcDm6h7JEwz7kk5fSW6EPFQaKA8+eHG9Hf7lq+ZsW0X0f7CBPWNJ4kuvYj8UzdLdWSlrobcEy8i1y9PMiv9m+6rKLqilCwVIbb87YtN0tfIKjVHvlX6HZqG5ul+7qps5/+NDUNO8XLb991+9NoVlppuzLpnlHGtZi9bnr0ozt9REfXB1n9D0BQOzGV9lkbKVWIWFh+zxMcg1R70G4G75Rrzwkc0BT0Vb/BnDfG65P8UPVjyFDrkSRMy3KlN87tvdDDUGRoLVTWvZE2x5ZUW5V4XzMY55ZR7YLXN7eqVFyWtKZpsFG39zL8xAOgOlQZ0B6BWAd0BAAB1ICY1AADqgO4AAIA6IB0AAFAHpAMAAOpoSweb+xEZN/r8+aMZ6NsDgDNIPq+kbXDGJ/XKmiNEAACoV/JZFlt03gFEwwCAswf4HQAAUAekAwAA6oB0AABAnfzSgcVDgTlJAHDWMKA7+O+6FtfRsI/0bs7Ad0AA4KxgYJ4FndYOfZoAcNbIrzvQ77/kfnMWAIA6B7ySAACoA9IBAAB1QDoAAKAOSAcAANTJJx1s1CkJ3wYCgLOHdo8mjdsuYMkgr/uku37osgCAMwbElQQAQB3wOwAAoA5IBwAA1AHpAACAOiAdAABQpzjp0DTV0yf3dJb188dGoJFwH5U+mdzmnuEhddWmneqnFksqim9ZziBFhYoFgLOpOwzO+IZ70aLrGiX7i8r6qSUi03JzZ7uKU+ITuU8mS8/8lFVV7IpTPeSAJ5lCecv7JS7RtSjzbQAoG2dQOtg62nAzffpYfQSHfmpFcM73+cdNj+8EBWFNEDa+f2n+wsmT0oid3vFGvg4AVQH8DieN2DnhQIE7G/eW+De6Q0uhe0tsNUXTlLcdPXgd4JsAUA30pUOTU+x50tcnk6VnvjNb47VZRZ7aI0418Z0M0do539NDM5K8T8SsvNZ5vF+0kpUeXoIzswQdOtOOgUczgyljO9srwUzytOdgcIZmoSNABRbrCpNM108lKP0RynoZND85fJAflXuIGs7b7R1ofyVbHGQgTnWPo9fue3G+XRjsxMrnQAHODDrSAbdb+31TfDa4JqzhZeP7uPkL3JxTNLZPmKJunBR8EUAt43YxrQ43dd42o5XNDZoRHxDdabniV/FimqZE88omOWbwFZqwGBMPwrDU9pNEvQKuRdQr+Yw++P67PBO20ZkDgJD0LOinkjbmG2576qEJLs+uRr0d7pnP2Z9z+ZCrP694aOrqQGgnjpxKv0OWoMU2BXrg3g7xbQCoEprSQey87Gg8erAZSiq8KBQO3Qvzdcr+7HaYPLKx8PfRI9zUu1JPdWx7NLSdyog3v399hBpN2W3FZEY7vHxcuDtCd+ZHXvyBT/vY8kq4MVchJK7N7erF9UpeVvGW/wf1ettuoB/4nJQt/13pMd2Zl472iZtRN3E6rA3eiTvG7U/SAoLYFB2BV/dANgBVR0s6NH1hbkRH0R9TLTyXo3im566xU/HOw5bEE2Yy0MXf3pghPjgZ5YdiOpUpyHAZbu3sVuFTXbb+G4KxejPcmVtbmVdIk/3ZUSpnqdPhTgB1jHcwRYzYFB37d0YzpHKBMKWozJ0vwFmgIl5JsbPHf6UFRV8MMssCGw5Yd8glHi/9jbi9iy2Bto5KKw+YtDOCIPXiXTn17u4YlAcZ7GTI2a1tqohhM4z2UwTuhHSdEgBQKSohHZje8drN7A6KzVSp3rjONqHYRlkgaWdEitLDdMde7vA1LRz3mT8CL1cceLuj3S/3KUwPAKgUWtIh9mP0CDWavyjPQ2i92cLXyoBwQ+HsY8MT1IPTUMFRFrYeP5UrZL8sreyjjgyPjK0TS9L4SyxZQ9ufUWdEcnlBejR3Xg8Ka5/dM2aFEVifBQykBApGU3cIbb8KHDWSnoikgBCt4pSyz0ITJlnab1tZzianeJm89MqGMPwV7yu0uT3DQiqcPmvDPNE2SByJ5WLL61tHvdIjd7KT0obLn5kpR4tb2nmw03J/nvf4ik7xvgPhXWBNACeOjmURHt0I3tk3TdiZZ7Hntin6ozHvWGh7887+keOKnWbsvhnfVPc7FIe86Nn93EONf98wWve4Ug430oWxLvdKxD/g+Rz5yjm82H+X9GPecHHfgweX/9MPZfnIR+zeZ8EH6DK2F7D54L9vCjwIFqIa5INqV1Ue/QnUBxAbqlrYSCQ+VKFPiukUjg0LqXfdA50WQMFUpM8C0IL1e5R/jiYd4akKiRpMBojwTQAwDugOAACoA7oDAADqgHQAAEAdkA4AAKgD0gEAAHVAOgAAoM6pkA6JIWnPK8VyO+VId51W95+h2LC0v89IB6LhA/NwEvFsS0PsjMp90ZOYt5GYEnHVe3Q5yI2VR++J8pbU7j3Se47zpZ4kp1l3oOOkk8Oks6hobNiiOcF4tjWHUwyPt6AHwVZhDS8XckaO6939UjiJe0QG4gvDHg0JoJ96kpxi6TD41bCgNY7nBGLDGuDUxbM1QmjbLKyZyzh02xiJLhNCR42aAUT07n4pnNA9IuGCyBQgvpmFfurJcXqlAx3kd+raElAd6u7u0ymCvZ9rCAD91BNDf6yk/cA7Et9caJ1DB9JI3IxQdPOSb+48n9wkxMZch914LyZqWvBdCKZnPSXsQ38dEONmnnpuc/XiXLCBbhAE+4GLFojQuc3AxxHxjQM1T3ua0gWQ6QFtuRMH6KwBvp5GMY3ANjjjkXqpC0NeX/Tt3pAMTW7Ath+ZqOB52uYaTub2SDwIXDI1VQzdFtK16v+rvP8Zlzfj4dVm1MtIzZRAM4/oqeUeokXT8VTHu/GW93Tj3M7+x+7Q+WTQjcRUTzgZBP/cg2CG+uAU9+5nT7o33cnQ/xNT4ttUyYEXF0fD6duL653vfuNghR+dC7xSpFoP5Cu54XOzCle9+zV+j1KHJEvMQC+V/TnNrJXDiO5gjY1d/dDnbnW7ravo3e/ZBcKCY/LQEro0TfcvROIjkwd2moIRhv56FX3o8+AkskyHPugeCUtDiWRqdHIkHlmwktRpKhqYEFFA3h1qQV30Y8OSJ0Lq3eWhYaloYP/WGHUVzxZzPG9/M25qvMNte7M7+rfbVn4TEGq4t0H2D74+x3coWAqxLHQJNudEqDme7wunSh588YHjSng+Nbu/KfbE/sYRvzRIsw9GUUZq+AIt1vrgCAuOZnZMtt9B6+5javce6Ucxq16MswIwIB0sIlrh+kJDcO7iz2QlMTQQR9Fm33Jy/0pzFMUHku1fXr4wx5MI8vJHgSgyW1jq8U3He5x3hakS8vllH85bFoitiu8tj0m75acxaQuhvuLZNiVIvOvoeUXc4AsZb3hDYBFz2EGUi3QDFjvfOfCezaZkxOCPcFN3XI6xEBXODnr8DldSQtsXlaklU7P3SD8EanUCpBaIEd0hlG7nWBDIeEM4Fs0oqtwvN0RQqv1jEvaxqOTd8/IlTLQDS4K8yIWEBZsaOXkzod6hQsl1KdFLbpzcvDUdzzbWgN/5He1huSc6L8amrIki2qeT2Hxo5/VFhd2R+ML8PtOh2PAS2wqNv9LWkutuVKYaQu/u19k9MgRTbFKKTPUwIB0iGq8bsyOcbPx4edONd7H2T8YvhEe6UYjZDtT0wLqDNg2R7NQCm7UmVF8rktqPZ3t+NHgpcHQONb53tByOXwn7VYcVaCN2Ron3Yf/SZ9s5j0DjoZ8PVSALdVL8mhNznLMVx8aLZmouxu9+PcQcPsWU0GcRDaQaf3JhbkWmWQQuLqfdkAlLjmdBgX5qKZQSWrLG49lSYudHN8zUd3CJ2PkoPtGZUu/yYT3wt2MdoXkwdJ7vUZJ2GaQWzW5Rm+k9Qh+81EgthVq6R0y1VQ+Bmi/1hChOOsjnQ2k/ggHsfyOaBYPlFY/TzZbaGln4f1pHhXbxsLiSOTFpsxnUjMJaq/Fstc8oRez8vc1c56IOx/OkZ4E4F3K+KtDwYxTrI1qWArMjjhTxipmt8UEBTUnn7tduzGF9SaaXauD+VoYidYeG5VUT6n4jDSUbuZCwDx2MMa8ka/+Ov9pZmnA8NqDswmr4OXQOmQ9v2unBwvGQ61BFdaAPSIE6I7uNyZi0tkEak7YQ6iuerfXgiXgs8laacFqO6Ef5jHglE1M9xN0QeKGuDoS2Pw6g+P2eWDIicUK0xuZF7ndc2sFi6P14xzGPo9v5drwRBV7lShkddO5+rd4jKsnWf9JwHuinnhRFWxbBC+7pSxHx3STzO7jeXkUfriyzR69h2XdpMxofmWRJf4v4MvwO8rJ5esFkGaFui8l3ltAlNa8EeUAyXhQG2PJ+6fKst9Gws899rranntxOC6ZPZDiZktRoPFutMwpfcEcTt7uZayB83/zBgxfW1Fe16PQKkkTMB9yY7dyDkO56RMhxhe+ki9JncX50zXonfjTBc731mtHKTrL9x5o+C14KmN4wx4TfjKVMul6DaN79Wo05TF2b2sJBL1Xnia0wpzlyHB3PslvuMSBYTauzKKz1d0aEytz9k4LcI5XBfZz8qSdzf0vwSlYc2p9d7u7s+ovCWn9nRKnI3T8hyIAJMl5C/eWvn3qS9xeizgIAoM5p1h0AADhJQDoAAKAOSAcAANQB6QAAgDogHQAAUKey0kEznGwZEGJjuHA2FmvsmO9UYDu1sTyVkH9Zjr952iKpAvXAKdUdqFjxpsPJ5HA8NnnYjZpp7JlW91zOPCGNmKXCrR7vY5EUOyB6H/cMdbHdOMH5B0me8MoT0vz1ooSZZsnV4PRFUgXqgcpKh4ZlT3LiZnnJDRKRSYExS8XrrvuX0YMlt7AU6vh0cr7Gnng61FZzpK1+agmc1lipQLmoT78DHV5WQHuwNZvRYejHfYT2wzsIOTq0lRYgDZ34dPpipQLlQks6CDHJuycNHQ+NRbltLx3wOZcp7Ad4/xhuSPYDFgZKGktN2STZkxkz/Q7Jku3JkqUxxQG0TB5LCsVHkoWkYlLax+ieSTKtMx1+JsvvUKhwQFuHUdQsftGCUIu1A6HATpAnICEdT6nFPsWtD2KAPPmDvUyh0AidacfAo5nkTEBm2yuNe7qt8BwM0qm9z31kKmo6PEkyXT+VoPRHKOtl0Pzk8EF+VM4hNEyLlnhg1ZfLzQGcALq6g9nxxvLLRRrZxRrAbVURVzaNakxaucnDcmmEhDI73llpydMLJtR9OJlq3sELvDqS0bRA1sni4bM/UXCO7pkmoSjT4Wcy/Q5EOBQWEiT0zHfnFRp3emWnA/15ehRnbaGeiGHXFzZ2RvZ558j4hdAdbH3M4sXj3rl6myeVTL1GUgVqHH3LIhUblkzKzogrm0ItJq0BNj9mkaPk4Ech3NB5yLmKIz/ccPeHiGawGnL3byy/ZLtxwtL/89Bm7/7sL78lOsLAza4dn7DoubdFz43qFDuvfl7C1gcltDU3ypIYmiUboU4jqQI1jq500I0rmyQ3Jq0BopHMICTmX3/L10qHTYcvBmY7DFxFRC7McbnAoP6Ijk8n5WFp/g9DUzaFxVE6GVZQdRpcFSKpnlisVKBcFOCVpLFhc17yWjFpTw7jMUsVCFPDRC68/HcqF9DNJ8y/MDyUlALB0aWFAHFPmB2XHeN9k/6JsYIiuBoHIqkCp4QCpAONDRtpMKYc1BryvUUPlgtL+zJqGXrS143+PC3MTj9ADn9KQOwHR/Ex2PpYWnhwiLe7J4obGZGP+omkCtQ4+l7JnNiw2RbBqUQnZqkRfmMhLoa3WArKP77CyoIl+y2+H7y3GigkgiuD+fDVhhfWZyRV7fMFagR93SEVGxYlaGxY02qy76DC0Mi06NervPYCKSZibZr/iRAXw0X82AtfXDajwwh59m1jpAuTf1pScP6DmJQgZaE+I6kCtY6+VzJwKXL1LR1TEHYg08L0hdQ4AF3YOGiaiwxLOOSRafVGRmcjL18MbKJuFplWMd7BGMVErE2xv/zZ2ib6dFKemBxHm3cWl0kw1a0594719gAb7DB5/3LkwRrt+DQOc5aqDsOoy0iqOucL1AhakeOEmDR5iALW1ECDGsN26mKWYkW7DqPdnsZYqUC5KMArWVOcupildRcb9vTGSgXKRb3qDgAAlEq96g4AAJQKRKwHAEAd0B0AAFAHpAMAAOqAdAAAQA2E/j/Gekhgl+lfUgAAAABJRU5ErkJggg==)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6IGQynix-1683042181155)(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUoAAAAlCAIAAACrnjdpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAApiSURBVHhe7Z07a+NaEIB17+8wdnbZi8DF/gARnBBIoWJxK7AhKRaDlu1SxC6SwinsLdKZGEyKBGJQa1KoWAhZEfwDtjCIXXZj4x9y58w5smVZj6OXH7E+DIl0fPSY0ZyZOZLG/+RyOcGVotrXFNo2va9Vrk3yX7n140rCdYT5ei5E9bGnCFrtU5e/T0YGF66XqxO59bh3t0uX37/srwcgqYOPB3NhDRqwSD6KNmWrEkYsq63HHz9+4uexpZZFulolK1syLsyQO7CyrxblFn6/f0a/TMAm2II6X+VDUZTPWv2ljSDYND+kfosdEgcwGtJetk+rzBrXi3jWX/nBiGLZLsmZcvnw05EgjLqVNC9LPvA67FgXqZv2XY48TQLMe8XANde72hduyZhy8LHWfs4rVz28BM2nZ1Bcfq9Iv0gR9wqCMH55GrHl3OGRJTy5VGL/cSC3vl2WBKPpdnHInV79JD9hh3RQu33JX/XmKuRgeIEDovVpDNj6XUM8Oz39YDTPqRzsyuXBT0fBFGW1A8NZXSoovZ/91pmchpGJZ1VJmGo3OltmvrCmjWFh2Ebth4l2E2CTzLvc6p3khheVxoCKwNSvmyAa6ZjYkqm/TIXcvl0vxaP9gjB9fmICM4bDwv4Rtf9ySRoPh0SsPOiNT5XGte4u+L+gmNkhCeag27yfCqWqujDQZARjXjeIkNlYbCn3M1945a+jAOSWVlcKL7WP7eFYq31sGkLpKPmwRTw6zNmdzSaQgnmzkZJGI/1+xzlSvocIjbZCeDY3ElH9LAlGmzo3mW7h8TQPJlrYI1sYvU4W/DMEzfuQa01+zzRuGAazf/lYmj4b8P346NcNazRmmL/JgeT/Y4tpIoIcmKxcfI5ol7MtZcBE5lGV3eXMEhkYSWFBuqLdyffnG4dkxycZCdLvxgFjPXjP21nKDSNLo5t4DFU+VQr2vXDgL+ckSNy82UjZVmgMVml+L53aj7ugVCFCgyalPRQkRbPSaXTFw+9oSuVWvSRosIVbQZrH2LphQHfLP9PBUhgaNj3p34do/xCZT1/0P2xt0sDYIQjTyS+2GIjNhEJlm6D7Xr0webAkeffb7nPASnszOdcuJpIj0PWSM7hBjBJrEIPYE4fZhBOZo6pL43aNfu0Zjt++5SD98gKJ9GVoe9hc0DmNtTv+USNAzsmQtHkX9/Jw7T8/6VaIYg4as8gWGT7QEGuk39nT6f/yOWYzVFIY5AzuMG9hgPWC22TxOQ4H4LAXXOvAIPH5GUTmqcVIOPRwx2CT4T3TH8k2xyGyTZLIFabaecMuyZnPYWneeZe2miioxUDXQ85ByF8UUAQkkFRnpiOEDtavP3SKFD69+uEERvBVzETAVUEG2b5a3mNrEie86w6Qc0Ikbd40hD7pkWCjo4Kzch7ueLLoVVmUK36Ay4byPk8mzF7xtM1Xe/6Mesq9ew//0sicefs54OFzyglE5lZCPocFpfQTcZiEEZfcFyR2Zdu+95YHXVu6aOpfUYVX9vl/r77+idxyKwqqkCeioXjIOQjnbKVzy4H6DcDsfrIGu+e8ojlmkpPQkQt6A0KYcU65UnBq7UfiCQUGdAuBZBBBck6IxINzKsqpUMhJJQWcVW/pbpY3k1frbKd/XUNrjM9LJdjg+3fOyJyCHh4i8yXrjg+7szrVlErX3eoCcZ3/jwpeqTNjIDFFUlte5M9f+zHH0a8dSIArbQNGitNI3UMy0htkWIEjH2rGNFeq98Lc+wigqFZLwvT+zuFqwrIo52RIYWqNiLJCRmiljaG1VOW91zc/N+qil0ERSKUy3vdyROYUcjfC1fxYzkk/oWNCP9uOs+UYfckk8LwvfiKPO37gSDofeWPo18nSBR1PR1xMnr6SYSXBex8YZkMqFNejOOWcBCmY94yR3j3nvUuJ09GUPxMSpeBsOY1hbODtMYhv6yREdvfwKZCA36bQ6UAeFaKfn88jOqCtCQdyCA0R7fulYaQj1EfC6NeVNC5oHnBYCbVfmjW4xSkRXXcYOccgqnmPnl7GGFk5rr9yiyQ2bKUoO+9defNrYt3WNru3Q3bmOGOxAO4XSScCX4baNnGVYW1bVDv2qXJR7uBc8YXzTpsr5vUDSRe11kzCYhm2xv4nrYJUf1StVpE87dcJMTFDB8r8sTML1W/AYnPKF7ZedMxvR9avJQ1rd6J81oeEIn5MG0xZtR0zKFQ+Pcm5h37hwTmgKJdigJwTIrL3NrvnkMlIdQ1zv9ld00Gj+X3v9BtNCHF29KLGFWWNug+QidHb2oMGhE8KbPkzpNe0eQZNXx3TEnFhT7DiQ8tk3ogcfB+DN1H9RlY6El34cEz8mN0bI//50urSqxYm7RBzxRAD19pGvkol/LN/+sF4mveFOLbWHu9brZeXx4JxE+biGHWb90MBslB6eDMNjroVyK4LbH3vEMYjmwYj6xelIRxfXtLdkb5ky/xPcXnrKIjBk3XM+NSaVs0b7drXRKybjhQP7uM+eyi1hy5KquOJz6cS/eWcEAGvlAjhXhqJx+r3mPHGCLiEEn6lhDxDfSLETtlSJMB702FyRc/Bgz+5GMIet+BBqIxNAwzb8u2rwtd1bwbe3ntdFOXWt6pUoEc11S4qyT8/mLGj7NwLoZtn3hkZGQmR5o2xjIyMtZKZd0bGmyUz74yMN0tm3hkZb5blqbUYBQ/9Cy3GKsO4a+yuFjb/ZvIWkaj39i+06N+63bACKRtxu/7taiFe+cdN0tGqyILzjM3CvK6k9OrbDpKZd0bGm8XTvD0KHlK8ivjFJk5xOc++LCqbVcl2O+ZoZQlTZ+Va4JGVK56hr1WLni2RNytJKQVLWY+zV+JwC9ZOF0+WVXHxK/+YijS2Hg/z9izEB4CsfYv4RYa8DxC1uFxg34JSf4dnBK33jtagM/KTRpqsRQuAn6y8WH6BmbJcdQjYUzslAwue126FKnvDgNVpojUeF2FlHjzLP6YqjW3Gy3t7FuLjKOIXkTjF5Tj6eramV5YwNmvQAhJFC7TQpbOiG614ySrnWRT2hRtWItIcNJqxX81MWRpbjId5exbi4yjiF5E4xeU4+nq2JlKWELskzhq0gETbMinIwX5zAgNyjDVIAdzlipf27QvmaMH2w8MpjXR0tNlEmlpbTxG/cPj3dbYmckYOH5U2m6YFWkiHVNGivwBFumAB3KWa8GkIilMaK9bRuolk3usq4hcG/77O1thnpH89OEimAAg3G6cFy2eSX4DS2vfCvixz15aLDYc01qCjdRPWvDejiJ8Tjr6eremdUXqkfMwRtUD9vFS/InXmdf1FOKy6/NRE8myjBldEaO/NVcQP4zSXQosUj9Y4xeU4+nq2xi9LCF28bgulRHpaQCJqgZZnhGiclBYcvU4K5IHnBAvaepV/5NPgqnW0CUQIznmK+HkUWmR4tMYpLhfYF8LFvyVax6934miNXZZwDaSmBcBPVr7gb5hYs1z4mxPcVUTpA6e4RxgTcqSQJi4u3N/yKv+4lRpcBbtQrQWG7aivZ+wcmazeFJGm1jIyMraBzLwzMt4ogvA/qR5dT5OCb7UAAAAASUVORK5CYII=)]


文件描述符fd

进程打开一个文件的本质

无论是c语言还是现在的linux环境下,我们都在说,只有打开了文件,我们才能对这个文件操作(读写操作…),而实际上我们打开的文件的本质是什么?

  • 就是将文件操作的相关属性,从磁盘加载到内存中,并在操作系统中建立相应的结构体(struct file)存放该文件的相关属性信息,而后将struct file的地址放到files_struct的fd_array中,建立起进程与文件的联系
  • 而对于os来说,打开的文件也是一种资源,所以os就需要对打开的文件进行管理,“先描述再组织”,实际上就是像前面的task_struct一样,使用双链表等数据结构,将struct file串联起来进行管理
  • 而进程:打开的文件,通常都是一对多的关系,所以进程的控制块中,files_struct中有一个struct file*的数组,指向打开的文件

文件描述符fd

通过对open函数的学习,我们知道了文件描述符就是一个小整数 ,而实际上fd就是进程的task_struct中files_struct中的fd_array下标,一个下标对应的就是一个打开的文件相关的struct file;

所以我们进程操作文件,就是通过fd然后去fd_array[]中找对应的struct file对文件进行操作,而默认情况下,os会默认为每个进程打开3个文件:标准输入 标准输出 标准错误 分别对应数组下标0,1,2

分别对应硬件:键盘,显示器,显示器

例:

文件描述符的作用

文件描述符的作用就是,通过文件描述符可以对打开的文件进行操作

而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构(struct file)来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件

理解linux下一起皆文件

还是先拿出之前初识操作系统的图

明明操作系统之下管理的都是一个个“硬邦邦”的东西,我们又怎么能说出,linux下一切皆文件呢?难道os将硬件都变成了文件吗?

我们上面一直在说文件操作,而文件操作的本质又是什么呢? 实际上就是对底层硬件进行读写操作,而如何对底层硬件如何进行读写操作呢?当然是通过我们的驱动程序

本质就是我们的驱动层实现了对应的读写方法(但我们知道显示器只能写(所以其实他的read方法就是空实现)),而到了os视角下,底层的一个个硬件就都变成了一个个相同的struct file,对其进行读写操作,只需调用struct file对应封装的read write方法即可

也就是说,在os系统下,底层的差异都被屏蔽了,都变成了对文件进行读写操作,根本不需要理会底层到底是什么,只需要调用对应的读写函数进行读写就行

注: 我们前面所说的系统接口write和这里所说的读写方法不是同一个,而我们现在大概也能猜测出来,我们调用系统调用write对指定文件进行操作时,实际上做了俩件事情

  • 将数据拷贝到struct file的缓冲区
  • 调用struct file的写方法,将数据写入到文件中去

父子进程
  • 父进程创建子进程时,我们会拷相应的数据结构给子进程,这也就包括我们的struct files_struct(文件指针数组),以及用户级别缓存区(发生写实拷贝)
  • 但需要注意的是,并不会多拷贝一份file struct,而是父子进程指向一个file struct;因为file struct是与文件打开相关的,而不是与进程创建相关的

文件描述符的分配规则

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

例:

如果我们在创建一个文件之前,将默认打开的3个文件使用close关闭一个,我们新创建的文件就会被填充到对应的空位置处,然后因为os或用户级别的接口只认识fd,而不管对于fd下标对应的文件是谁,就会将我们新创建的文件当成默认输出流,默认输入流,默认错误流使用,而这就是输出重定向之类的原理。


重定向的原理

经过我们之前对fd的理解,进程默认fd为1就是我们的输出,我们要实现重定向,实际上就是将原来要出到屏幕上的数据,输出到指定的文件里去,本质就是进程fd_array[1]指向我们要指定输出文件的struct file,后续就会将数据拷贝到该文件的缓冲区里去

输出重定向原理:

本来应该输出的标准输出流(显示器上的内容,被写入到了.txt文件中)

实现思路:

我们关闭fd(1),新创建的文件就会自动填补此空位(进程中file_struct的文件指针数组下标为1的地方,os默认认为这是标准输出流的文件.所以会当作标准输出流,将内容输入到文件中去

例:

运行结果:


追加重定向:

思路:

只需在打开文件时加多一个O_APPEND 即可实现追加重定向


输入重定向:

实现思路:

将关闭fd=0的文件,然后打开我们所需进行输入重定向的文件,对该文件进行读取

dup2 系统调用实现重定向

int dup2(int oldfd, int newfd);

描述:将oldfd中的文件指针对于的文件的地址拷贝到newfd去,覆盖掉原来newfd指向的文件,将newfd的文件指向也改到oldfd指向的文件

函数特点:

不用关闭默认打开的文件,使用这个函数就可以实现各种重定向,即不需要进行打开和关闭文件等操作就可以实现重定向

例:


标准输出1 和标准错误2的区别:

进行输出重定向时,只能将标准输出的内容重定向到指定文件中去

#include <stdio.h>    
  #include <sys/types.h>    
  #include <sys/stat.h>    
  #include <fcntl.h>    
  #include <string.h>    
  #include <unistd.h>    
      
  int main()    
  {    
W>  char * msg1="hello 标准输出\n";                                                                                                                                                         
W>  char * msg2="hello 标准错误\n";    
    write(1,msg1,strlen(msg1));    
    write(2,msg2,strlen(msg2));    
    return 0;    
  }                 

运行结果:

其实本质是因为输出重定向的本质是将指定文件的struct file的地址填入到进程的fd_array[1]处

而如果我们也想将输出到标准错误的结果也输出到指定的文件里去,只需将对应的文件的struct file的地址填入到fd_array[2]中即可

那我们就可以这样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VbEdGp3Q-1683042181161)(C:\Users\LANSHUHANG\AppData\Roaming\Typora\typora-user-images\image-20230427160606103.png)]

2>&1 意思就是fd_array[1]的内容拷贝到fd_array[2]处,即文件描述符1 2 指向的struct file都是我们的tat.txt的struct file


FILE

  • 因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,对文件进行操作都是通过fd访问。
  • 所以C库当中FILE结构体内部,必定封装了fd
用户级别缓存区

即在c语言这样的封装系统接口的语言中含有的缓存区

我们调用c语言的IO流接口时(sprintf,printf,scanf ,scanf……),其实都是先将数据输入到c语言级别的缓存区中,然后等进程结束后再刷新到os系统的缓存区中去

刷新策略

用户->os 和os->磁盘都适用

  • 立即刷新(不缓冲)
  • 行刷新:(行缓冲,行缓冲\n),例如:显示器打印 \n为回车换行 换行\r
  • 全缓冲:缓存区满了,才刷新(全刷新), 比如:往磁盘文件中写入

注:

  • 一般是进程退出时,会将语言级别的缓冲区里面的数据刷新到内核级别的缓冲区里,最后显示到屏幕上
  • c语言中默认打开的3个文件流
    • stdin(对应文件描述符0)
    • stdout(对应文件描述符1)
    • stderr(对应文件描述符2)
验证用户级缓冲区例子1:

先看代码:

  #include <stdio.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <string.h>


  //验证缓冲区    
  int main()    
  {    
    close(1);                                                                                           
    int fd=open("./buf.txt",O_CREAT|O_RDWR,0664);
    char * msg1="hello 标准输出\n";
    char * msg2="hello 标准错误\n";
    write(1,msg1,strlen(msg1));
    write(2,msg2,strlen(msg2));
    printf("hello printf\n");         
    fprintf(stdout,"hello fprintf\n");             
    return 0;              
  }                        

运行结果:

解释:因为我们将fd_array[1]对应的文件关闭掉了,而我们新打开文件buf.txt时,os就会把buf.txt对应的struct file的地址填入到文件描述符1处,也就是说我们从之前的向显示器文件打印转换成了向磁盘的文件打印,所以刷新策略会从行刷新变成全刷新,即c语言缓冲区里面的数据会在进程退出后,才被刷新到buf.txt的os级别的缓冲区里

而这时候如果提前将buf.txt对应的fd也关闭执行同样的程序会发生什么呢?

预期结果应该是:

因为c语言级别的缓冲区里的数据是进程终止时才被刷新到os的缓冲区里的,如果我们在进程退出前将该文件关闭,就会出现c接口的写操作不会显示

  #include <stdio.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <string.h>


  //验证缓冲区    
  int main()    
  {    
    close(1);                                                                                           
    int fd=open("./buf.txt",O_CREAT|O_RDWR,0664);
    char * msg1="hello 标准输出\n";
    char * msg2="hello 标准错误\n";
    write(1,msg1,strlen(msg1));
    write(2,msg2,strlen(msg2));
    printf("hello printf\n");         
    fprintf(stdout,"hello fprintf\n");
    close(fd);  //实际上这里的fd也是1 可以直接填close(1)
    return 0;              
  }                        

运行结果:

跟我们所预料的差不多

其中也有办法可以解决这个c语言缓冲区的数据不能刷到os级别的缓冲区里,使用fflush强制刷新FILE里面的数据到os级别缓冲区里

#include <stdio.h>
int fflush(FILE *stream);

函数作用:强制刷新FILE*所指向FILE文件流的c语言级别缓冲区的数据到os级别的缓冲区

  #include <stdio.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <string.h>


  //验证缓冲区    
  int main()    
  {    
    close(1);                                                                                           
    int fd=open("./buf.txt",O_CREAT|O_RDWR,0664);
    char * msg1="hello 标准输出\n";
    char * msg2="hello 标准错误\n";
    write(1,msg1,strlen(msg1));
    write(2,msg2,strlen(msg2));
    printf("hello printf\n");         
    fprintf(stdout,"hello fprintf\n");
    fflush(stdout);
    close(fd);  //实际上这里的fd也是1 可以直接填close(1)
    return 0;              
  }                        

运行结果:

结论:

  • 系统调用接口write并不受这个影响 ,所以说明该缓冲区一定不在os层
  • 而c语言接口又是封装的系统接口,所以缓冲区就一定在c语言层,实际上就是在FILE文件流里

验证用户级缓冲区存在的例子2

#include <stdio.h>
#include <string.h>
int main()
{
 const char *msg0="hello printf\n";
 const char *msg1="hello fwrite\n";
 const char *msg2="hello write\n";
 printf("%s", msg0);
 fwrite(msg1, strlen(msg0), 1, stdout);
 write(1, msg2, strlen(msg2));
 fork();
 return 0;
}

运行结果为:

hello printf

hello fwrite

hello write

但如果我们进行输出重定向时./hello > file

结果就会变成

hello write
hello printf
hello fwrite
hello printf
hello fwrite

我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和 fork有关!

  • 一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲
  • printf fwrite 库函数会自带缓冲区(上面那个例子可以说明),当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。
  • 而我们放在缓冲区中的数据,就不会被立即刷新,甚至fork之后
  • 但是进程退出之后,会统一刷新,写入文件当中。
  • 但是fork的时候,父子数据会发生写时拷贝,所以当你父进程准备刷新的时候,子进程也就有了同样的 一份数据,随即产生两份数据。 即子进程的缓冲区也拷贝了相同的数据
  • write 没有变化,说明没有所谓的缓冲。

综上: printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区, 都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区。 那这个缓冲区谁提供呢? printf fwrite 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统 调用的“封装”,但是 write 没有缓冲区,而 printf fwrite 有,足以说明,该缓冲区是二次加上的,又因为是 C,所以由C标准库提供。

总结:

显示器默认刷新规则:行刷新

其他文件:全刷新


上面我们说的都是已打开的文件的相关概念,而如果一个文件没有被打开,其实是存在磁盘里面的。所以我们有必要对磁盘有一个基本的了解,可以帮助我们更好的理解文件管理系统

理解磁盘

磁盘(disk)是指利用磁记录技术存储数据存储器

磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘([Hard disk](https://baike.baidu.com/item/Hard disk/2806058?fromModule=lemma_inlink),简称硬盘)。

而于磁盘相对的概念就是内存,内存也是存储器,但内存是断电后数据就会丢失

磁盘的物理结构图片的图像结果

此图取自网络,侵权删

盘片

一个磁盘(如一个 1T 的机械硬盘)由多个盘片叠加而成。盘片的表面涂有磁性物质,这些磁性物质用来记录二进制数据。因为正反两面都可涂上磁性物质,故一个盘片可能会有两个盘面。

磁道、扇区

每个盘片被划分为一个个磁道,每个磁道又划分为一个个扇区。其中,最内侧磁道上的扇区面积最小,因此数据密度最大。

柱面

每个盘面对应一个磁头。所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。所有盘面中相对位置相同的磁道组成柱面。 --取自百度百科

从上面我们即可得知,磁盘的最小存储单元为扇区

而我们知道os是磁盘的管理者,而存放在磁盘里面的未打开的文件也是资源,所以也需要进行管理,怎么进行管理呢?下面来介绍

Linux中EXT2文件管理系统

在操作系统下,磁盘其实是这样的线性结构,就好像我们小时候玩的磁带一样

我们会发现磁盘就是一个又一个的扇区,如果直接进行管理,成本很高,于是前辈就想到先将磁盘分成一个一个区,然后分别进行管理,只要管理好了第一个区,其他区只需照搬管理机制即可,而区又还太大了,前辈又再将区分成一个块组进行管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xybiQyKl-1683042181163)(C:\Users\LANSHUHANG\AppData\Roaming\Typora\typora-user-images\image-20230427184536661.png)]

我们的磁盘被分成许多区,然后分别管理,每个区都使用相同的管理系统(linux特有的EXT的文件管理系统),而每个区的大概分布都是这样的

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。

  • Boot Block:基本每个分区都会有,从这个块数据可以得知,该磁盘有多少个分区,也可以知道操作系统的相关代码存储在那个分区的那个块里面,这样就可以进行启动了
  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。注:Super Block的信息被破坏,可以说整个文件系统结构就被破坏
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下 块位图(Block Bitmap):
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用,(每个比特位代表一个特定的inode)
  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等以及属于我们数据块的编号(即文件信息)
  • 数据区:存放文件内容

理解在os中创建一个文件的本质的过程

1.通过inode map查找到一个没有被使用的inode编号,而后通过这个inode编号知道对应的inode数据块,将文件的属性信息写入到inode数据块中

2.通过block bitmap申请空闲的数据块,将对应的数据块编号写入到inode数据块中,关联起来

3.找到对应的block数据块,将内容写入

4.找到当前目录文件的block数据块,将文件名:inode的映射关系写入到目录文件的数据块里

小结:

  • 文件=文件属性(存储在inode数据块中)+文件内容(block数据块中)

理解目录文件

  • 目录也是文件,所以目录也有自己的文件属性和文件内容
  • 目录文件的内容实际上是当前目录下的文件:inode映射关系

理解在目录中删除文件的本质

例:假设我们现在要 rm hello.c

  1. os会在该目录文件的block数据块中找到hello.c对应的inode编号,而后将inode关联的block数据块编号,在block bitmap中的位置由1置0,而后再将该inode再inode bitmap的对应位置也由1置0
  2. 最后再在该目录文件删除文件名和inode编号的映射关系

而我们在windows下删除文件,实质上是将文件移动到了名为“回收站的目录文件下”

这就是为什么删除文件的速度这么快而拷贝文件的速度慢的原因,因为删除文件是逻辑删除

理解在命令行输入 ls的本质

  • 有了上面的理论基础,实际上我们很容易得知,我们在当前目录敲下ls
  • 本质是,进程通过当前目录的inode找到对应的inode数据块,而后从里面拿到与之关联的block数据块编号,而后通过这些编号去找到对应的数据块,将对应的数据块里面的数据显示到显示器上

从上面我们即可得知,在Linux下,文件名并不是文件的标识符,inode编号才是

俩个查看文件状态的相关命令:

ls -i选项

查看文件指向的inode (读取存储在磁盘上的文件信息,然后显示出来)

图中的第一行就是inode

stat 命令

通过stat能够看到更多消息


软硬链接

理解硬链接

指令: ln

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个 inode。

 [root@localhost linux]# touch abc 
 [root@localhost linux]# ln abc def
 [root@localhost linux]# ls -1i abc def 263466 abc 263466 def
  • def abc和def的链接状态完全相同,他们被称为指向文件的硬链接。
  • 内核记录了这个连接数,inode 263466 的硬连接数为2。 我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将**硬连接数-**1,如果为0,则将对应 的磁盘释放。
  • 硬链接的本质是,在当前目录文件下,建立一个文件名与inode的映射关系

软链接

硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法

指令:ln -s 文件名 文件名

例:

而我们发现我们的软链接是有自己的inode ,而我们其中inode对应的数据块存放的链接路径信息,而我们的硬链接是没有自己的inode的

硬链接的本质是一个文件名和inode编号的一个映射关系,因为自己没有独立的inode。而创建硬链接的本质就是在目录文件下添加一对映射关系。

软链接的是一个的独立的文件,是有自己的文件编号的,有自己inode编号,也有自己的数据块(存放的是文件存放的路径和对应的文件名)

acm
  • Access :最后访问时间 (在较新的Linux系统下,Access时间不会马上被更新,而是会隔一段时间再进行更新)

  • Modify 文件内容最后修改时间

  • Change 属性最后修改时间

acm和gcc g++编译的关系

我们在命令行进行编译c或c++程序时肯定出现过这样的场景

而我们的gcc g++又是如何判断是否需要重新编译我们的c,c++文件的呢?

就是通过文件的change属性,如果可执行文件的change时间被我们的源文件新,就说明我们的源文件并没有更新

-TSiU7CM4-1683042181164)]

而我们发现我们的软链接是有自己的inode ,而我们其中inode对应的数据块存放的链接路径信息,而我们的硬链接是没有自己的inode的

[外链图片转存中…(img-DiuDQukw-1683042181164)]

硬链接的本质是一个文件名和inode编号的一个映射关系,因为自己没有独立的inode。而创建硬链接的本质就是在目录文件下添加一对映射关系。

软链接的是一个的独立的文件,是有自己的文件编号的,有自己inode编号,也有自己的数据块(存放的是文件存放的路径和对应的文件名)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值