linux之常见的系统函数

本文详细介绍了Linux系统编程中的文件管理,包括open、close、read、write、lseek和stat等函数的使用。同时讲解了进程管理,如fork、waitpid、exec家族、exit和kill等函数,以及文件和目录管理的相关函数。此外,还涵盖了环境变量的获取和设置,以及文件描述符的复制。这些内容对于理解Linux底层操作至关重要。
摘要由CSDN通过智能技术生成

1. 文件管理

1.1 open函数:打开文件

int open(const char *pathname,int flags,mode_t mode);
  • 返回值:open成功返回文件描述符,失败返回-1
  • filename:要打开的文件名
  • flags:打开的方式
  • mode:若以创建的方式打开,用mode设置文件的权限

1.2 close函数:关闭文件

int close(int fd);
  • 返回值:0代表关闭成功,-1产生错误
  • fd:文件描述符

1.3 read函数:从文件中读取

ssize_t read(int fd, void *buf, size_t count);
  • 返回值:
    • -1:读文件失败
    • 0:文件已被读完
    • 正数:读取的字节数
  • fd:文件描述符
  • buf:缓冲区,传出参数,用于存放读取的数据
  • count:读取时指定要读取的字节数

1.4 write函数:向文件中写入

ssize_t write(int fd, const void *buf, size_t count);
  • 返回值:写失败的时候返回-1。 写成功返回写入的字节数
  • fd:文件描述符
  • buf:缓存区,传入参数,提供要写入的数据
  • count:指定要写入的字节数。

1.5 lseek函数:移动文件指针

off_t lseek(int fd, off_t offset, int whence);
  • 返回值
    • 返回-1表示出错
    • 成功则返回相对文件开始的偏移量
  • fd:文件描述符
  • offset:偏移量
  • whence:偏移量相对于什么开始的

1.6 stat函数:查看文件状态

int stat(const char *pathname, struct stat *statbuf);
  • 返回值:操作是否成功
  • pathname:查看哪个文件的状态
  • statbuf:传出参数,封装状态结果

2. 进程管理

2.1 fork函数:创建子进程

pid_t fork(void);
  • 返回值
    • 子进程中,返回值值为0
    • 父进程中,创建子进程成功则返回子进程pid;创建线程失败则返回-1

2.2 waitpid函数:等待子进程终止

// 回收任意子进程
pid_t wait(int *wstatus);

pid_t waitpid(pid_t pid, int *wstatus, int options);
  • 返回值:-1表示出错,其他情况表示返回的子进程pid
  • wstatus:传出参数,接收子进程退出的状态信息。
  • pid:
    • <-1 回收指定进程组内的任意子进程
    • -1  回收任意子进程(相当于wait)
    • 0 回收和当前调用waitpid进程一个组的所有子进程
    • >0 回收指定id的子进程
  • options:可以用来指定以非阻塞方式运行
    • 非阻塞方式执行,直接返回系统调用结果。
      • 如果没有子进程结束,返回值为0
      • 如果有子进程结束,返回值为子进程的id

2.3 exec函数族:替换一个进程的核心映像

  • l(list): 命令行参数列表
  • p(path): 搜索文件时使用PATH环境变量
  • v(vector):使用命名行参数数组
  • e(environment):使用环境变量数组,不适用进程原有的环境变量。设置新加载程序运行的环境变量
// l代表list,p代表path
int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);
// 示例
execlp("ls","ls","-l","-F",NULL);


// 没有使用path环境变量,所以pathname需要指明绝对路径
int execl(const char *path, const char *arg, ... /* (char  *) NULL */);
//示例
execl("/bin/ls","ls","-l","-F",NULL);

// p代表使用系统的PATH环境变量
int execvp(const char *file, char *const argv[]);

// e代表使用自己定义的环境变量数组
int execve(const char *file, char *const argv[], char *const envp[]);
  •  变参需要以NULL结尾
  • 返回值:只有在失败会返回-1,成功的话啥都不返回。因为整个代码都被替换了。
  • argv:参数数组
  • envp:环境变量数组
int main(){
    if fd;
    // 打开已经存在的文件
    fd=open("hello.txt",O_RDWR);
    // 如果打开失败
    if(fd==-1){
        // 输出失败原因
        perror("open file");
        exit(1);
    }

    // 将标准输出替换为指定文件
    dup2(fd,STDOUT_FILENO);
    
    // 如果这个成功,后面的代码就不走了,因为代码被替换了。
    execlp("ps","ps","ax",NULL);
    // 只有上一步执行发生错误,才会执行下面的逻辑
    perror("exec error");
    exit(1);
    return 0;
}

2.4 exit函数:终止进程被返回状态

void _exit(int status);

2.5 kill函数:发信号给进程

int kill(pid_t pid, int sig);

 2.6 getpid函数:获取当前进程的id

pid_t getpid(void);

2.7 getppid函数:获取当前进程的父进程id

pid_t getppid(void);

 2.8 getuid函数:获取当前进程的实际用户

uid_t getuid(void);

2.9 getgid函数:获取当前进程的用户组id

gid_t getgid(void);

3. 文件和目录管理

3.1 mkdir函数:创建目录

int mkdir(const char *pathname, mode_t mode);
  • 返回值:是否成功
  • pathname:目录名
  • mode:目录的权限

3.2 rmdir函数:删除空目录

int rmdir(const char *pathname);

3.3 chdir函数:改变工作目录

int chdir(const char *path);

3.4 chmod函数:修改文件保护位

int chmod(const char *pathname, mode_t mode);

3.5 link函数:创建一个硬链接

int unlink(const char *oldpath,const char *newpath)

 3.6 unlink函数:删除一个链接

int unlink(const char *pathname);
  • 如果是符号连接,删除符号连接
  • 如果是硬链接,硬链接数减一。减到0时,释放数据块和inode
  • 注意:如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等待进程关闭文件时,kernel才真正去删除该文件。 

补充:目录(文件)项的组成

  • denty:目录项
    • ​​​​​​​文件名
    • inode编号(对应一个inode结构体)
      • ​​​​​​​存储指针地址(从而找到文件的磁盘位置)
      • 大小
      • 权限
      • 类型
      • 所有者

3.7 truncate函数:修改文件为指定大小

  • 将参数path指定的文件大小改为参数length指定的大小。如果原来的文件比参数length大,则截断。如果原来的文件比参数length小,则增加。
int truncate(const char *path, off_t length);
  • 返回值:是否成功
  • path:文件路径
  • length:指定的文件大小

4. 环境变量

4.1 getenv函数:获取环境变量的值

char *getenv(const char *name);
  • 返回值
    • 成功时返回环境变量的值
    • 失败时返回NULL

4.2 setenv函数:设置环境变量的值

int setenv(const char *name, const char *value, int overwrite);
  • 返回值:值为0表示成功,值为-1表示失败
  • overwrite:
    • 1:覆盖原来环境变量
    • 0:不覆盖

4.3 unsetenv函数:删除环境变量

int unsetenv(const char *name);
  • 返回值:
    • 0:删除成功
    • -1:删除失败

5. 文件描述符的复制

5.1 dup2函数

// 用文件描述符oldfd的值去覆盖文件描述符newfd的值。最后返回文件描述符newfd
int dup2(int oldfd, int newfd);
  • 返回值:
    • 返回值被覆盖的文件描述符
  • 用文件描述符oldfd的覆盖文件描述符newfd的。最后返回文件描述符newfd
  • 可以实现原本输出到终端变成输出到指定文件中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值