Linux系统编程

169 阅读5分钟

Linux系统编程之文件

操作系统提供了一系列的API

如Linux系统:

打开       open
读写       write /read
光标定位   lseek
关闭       close

文件打开及创建

打开文件open函数

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

Pathname:要打开的文件名(含路径,缺省为当前路径)

Flags: O_RDONLY 只读打开         O_WRONLY 只写打开         O_RDWR  可读可写打开

    当我们附带了权限后,打开的文件就只能按照这种权限来操作。 以上这三个常数中应当只指定一 个。下列常数是可选择的:              O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。         O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错。        O_APPEND 每次写时都加到文件的尾端。         O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。

Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限

3d70b5a247809df4a79d2837e49f2f5.png

image.png

1678032357457.jpg

创建文件creat函数

int creat(const char *filename, node_t mode)

filename:要创建的文件名(包含路径、缺省为当前路径)

mode:创建模式(可读可写可执行)

常见的创建模式:

宏表示          数字
S——IRUSR         4          可读
S——IWUSR         2          可写
S——IXUSR         1          可执行
S——IRWXU         7          可读、可写、可执行

image.png

image.png

以第一条为例:

-rwx
-代表是普通文件;r是可读权限;w是可写权限;x是可执行权限

参数0600得到的权限是-rw-,所以参数0600代表权限就是可读可写

6代表4+2(4是读,2是写,1是执行)

第一位:

第二位:给文件所有者的权限

第三位:与用户同组

第四位:其它组

写入文件

ssize_t write (int fd, const void *buf, size_t count)

可以理解为,将无类型指针指向的大小为count的文件*buf写入文件描述符为fd的文件中

image.png

将sizeof换成strlen

读文件(与写文件刚好相反)

ssize_t read (int fd, void *buf, size_t count)

从fd指向的文件中读取count个字符到buf指向的文件

image.png

image.png

image.png

文件光标移动操作

image.png

方案一:将文件关闭后再打开,实现光标位置的重置

image.png

方案二:直接移动光标的位置

lseek函数

   lseek - reposition read/write file offset

   off_t lseek(int fd, off_t offset, int whence);

将文件读写指针相对whence移动offset个字节

image.png

将光标移动到文档头的方式一:

lseek(fd,0,SEEK_SET);

image.png

将光标移动到文档头的方式二:

lseek(fd, -offset,SEEK_CUR);

注意函数中的第二个参数是负数,负数代表光标向前移动,正数代表向后移动

image.png

文件打开创建的补充

Linux系统编程之进程

Linux网络编程

进程间通信的方式:

管道

消息队列

共享内存

信号

信号量

以上方式的共同点是依赖内核

因此提出网络编程,在不同的实体之间进行的通信(多机通信)

TCP/UDP协议对比

  1. TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前 不需 要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  5. TCP首部开销20字节;UDP的首部开销小,只有8个字节
  6. TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

端口号作用

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等

这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?

显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。

实际上是通过“IP地址+端口号”来区 分不同的服务的。

端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。

例如,对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。

字节序(网络字节序=大端字节序)

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序

小端字节序(先存放数据的低位)

大端字节序(先存放数据的高位)

和大端存储,小端存储一个意思

socket编程

socket服务器和客户端的开发步骤

image.png
1.创建套接字
2.为套接字添加信息(IP地址和端口号)
3.监听网络连接
4.监听到有客户端接入,接受一个连接
5.数据交互
6.关闭套接字,断开连接

Linux提供的API协议

int socket(int domain, int type, int protocol);

image.png

image.png

image.png

image.png