computer_knowledge_notes/Languages/CLang/libraries/unistd.md

3.3 KiB
Raw Blame History

概述

unistd是unix std的意思由POSIX标准定义。包含了大量的对系统调用的封装。

相关函数

创建管道
/*
 * 创建单向的管道。
 * 参数向pipefd[1]的写入在pipefd[0]能读出来。
 * 返回值成功返回0失败返回-1。
 */
int pipe(int pipefd[2]);

int pipe2(int pipefd[2], int flags);
截断文件
/* 将文件名为path的文件截断到长度为length字节截断的原则是多退少补
 * 返回值0成功-1失败。
 */
int truncate(const char *path, off_t length);

/* 将文件描述符为fd的文件截断到长度为length字节截断的原则是多退少补
 * 返回值0成功-1失败。
 */
int ftruncate(int fd, off_t length);
运行文件

exec()家族的后端是execve()系统调用,它们都是用新进程来替代当前进程。它们只有在发生错误才返回,返回值是-1。

  • p - 表示可以在环境变量PATH里找可执行文件
  • e - 表示可以通过参数指定环境,即envp[]
  • v - 表示在参数里提供了指针数组,即argv[]。v和l是互斥的。
  • l - 表示是以const char *的形式给出的参数。l和v互斥的。
 extern char **environ;

/* 要执行的文件必须以路径的形式给出即path */
int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */);

/* 如不包含斜杠则在环境变量PATH里找可执行文件否则执行指定路径上的文件 */
int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);

/* 要执行的文件必须以路径的形式给出即path
 * 可以通过envp指定环境
 */
int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, char * const envp[] */);

/* 要执行的文件必须以路径的形式给出即path */
int execv(const char *path, char *const argv[]);

/* 如不包含斜杠则在环境变量PATH里找可执行文件否则执行指定路径上的文件 */
int execvp(const char *file, char *const argv[]);

/* 如不包含斜杠则在环境变量PATH里找可执行文件否则执行指定路径上的文件
 * 可以通过envp指定环境
 */
int execvpe(const char *file, char *const argv[],
                       char *const envp[]);
其它
/* 关闭文件描述符 */
int close(int fd);

/* 从文件描述符fd里读取count个字节到到缓冲区buf里。注意read会使文件位置增长。
 * 返回值成功则返回读取的字节数返回0代表已到了文件的末尾。错误则返回-1。
 */
ssize_t read(int fd, void *buf, size_t count);
/*
 * 从缓冲区buf写入count个字符到文件描述符fd。
 * 返回值:成功则返回写入的字节数。错误则返回-1。
 */
ssize_t write(int fd, const void *buf, size_t count);
/*
 * 在运行的时候获取配置信息
 * name: _SC_NPROCESSORS_ONLN当前在线的处理器数量
 * 		_SC_NPROCESSORS_CONF已配置的处理器数量
 */
long sysconf(int name);

/* 创建子进程
 * 返回值成功如是父进程则返回子进程的pid如是子进程则返回0。失败父进程返回-1子进程不会创建。
 */
pid_t fork(void);

/* 返回当前线程在内核里的线程id */
pid_t gettid(void);