computer_knowledge_notes/Languages/CLang/libraries/unistd.md

104 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#### 概述
unistd是unix std的意思由POSIX标准定义。包含了大量的对系统调用的封装。
#### 相关函数
##### 创建管道
```c
/*
* 创建单向的管道。
* 参数向pipefd[1]的写入在pipefd[0]能读出来。
* 返回值成功返回0失败返回-1。
*/
int pipe(int pipefd[2]);
int pipe2(int pipefd[2], int flags);
```
##### 截断文件
```c
/* 将文件名为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互斥的。
```c
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[]);
```
##### 其它
```c
/* 关闭文件描述符 */
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);
```