int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
参数说明:
pathname: 打开文件的路径
flags : 打开标志
mode : 只要使用 O_CREAT标志,就要使用这个参数,设置权限
返回值:
成功返回文件描述符
失败返回-1
1、以只读的方式打开文件,如果文件不存在,打开失败, 文件存在打开成功,文件指针指向文件开始的位置!
2、以只写的标志打开文件,如果文件不存在,打开失败, 文件存在打开成功, 默认不清空文件中的内容,文件指针指向开始位置
3、一般以写方式打开文件,会将 O_CREAT|O_WRONLY|O_TRUNC,一起使用, 表示的含义是:
如果文件不存在, 以第三个参数的权限创建文件,并且以写的方式打开文件
如果文件存在, 以写的方式打开文件,并且清空文件中所有的内容
4、默认情况下,新建文件的权限是 mode & (~umask), 如果不希望权限受到掩码的影响,可以直接将掩码设置为0
5、以追加的方式打开文件,如果文件不存在,打开失败, 文件存在打开成功,文件指针指向文件尾部
ps :追加的方式作写操作,仍然要或上 O_WRONLY
pid_t wait(int *wstatus);
函数功能: 回收子进程的资源(接收子进程退出的原因和返回值)
WIFEXITED(wstatus): 如果子进程是调用exit 正常退出,该宏为真
WEXITSTATUS(wstatus): 如果上面的宏为真,调用该宏过滤退出返回值
WIFSIGNALED(wstatus):如果子进程是由于信号退出的,该宏为真
WTERMSIG(wstatus):如果上面的宏为真,可以调用该宏过滤信号值
注意事项:
1、如果没有子进程,wait是一个非阻塞函数
2、如果有子进程,wait 是一个阻塞函数, 如果有子进程退出,wait 立马解除阻塞,回收子进程的资源
3、返回值的返回 0-255
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
函数功能: 创建线程
参数说明:
pthread : 传出新建线程的标识符
attr: 设置线程属性
start_routine: 线程入口函数
arg: 给新建线程传递参数
返回值:成功返回0, 失败返回错误编号
PS: 编译时要手动连接到线程库(gcc XX.c -o xx -lpthread)
pthread_exit: 线程退出
ps: 在线程入口函数中, return 和 pthread_exit 的意义是一样的
在子函数中, return表示本函数结束, pthread_exit 仍然表示当前线程结束!!!
在线程中谨慎使用 exit !
int fcntl(int fd, int cmd, ... /* arg */ );
函数功能: 设置文件锁
参数说明:
fd : 文件描述符
cmd :命令
F_SETLKW :设置文件锁
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
...
};
int fcntl(int fd, int cmd, ... /* arg */ );
函数功能: 设置文件锁
参数说明:
fd : 文件描述符
cmd :命令
F_SETLKW :设置文件锁
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
...
};
注意事项:
1、管道两端都是正常的, 如果管道里没有数据, read函数是阻塞的,
如果写端断开或者出现异常, read函数解除阻塞,返回值为0
2、如果读端异常, 写端继续往管道中写数据,内核会发送SIGPIPE信号,
该信号的默认操作是程序退出, 所以写端一定要捕捉 SIGPIPE信号
int shmget(key_t key, size_t size, int shmflg);
函数功能: 创建共享内存
参数说明:
key : 键值
size : 内存大小
shmflg: 设置标志 IPC_CREAT|0777
返回值:
成功返回共享内存的标识符
失败返回-1
void *shmat(int shmid, const void *shmaddr, int shmflg);
函数功能: 将共享内存映射到程序中
参数说明:
shmid : 共享内存标识符
shmaddr :指定映射地址, 一般使用NULL,由系统指定
shmflg: 设置标志 ,一般使用 0
返回值:
成功返回映射的虚拟地址
失败返回 (void*)-1
int msgget(key_t key, int msgflg);
函数功能: 创建 或者 获取消息队列的标识符
参数说明:
key : 键值, 一个键值和一个消息队列是一一对应的关系
msgflg: 设置标志, 一般使用 IPC_CREAT|0777
返回值:
成功返回消息队列的标识符
失败返回-1
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
函数功能: 往消息队列中发送一个消息
参数说明:
msqid: 消息队列标识符
msgp: 打包消息信息结构体的起始地址
msgsz: 消息大小
msgflg: 设置阻塞标志, 0 表示阻塞
返回值:
成功返回0, 失败返回-1
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
函数功能: 从消息队列中读取数据
参数说明:
msqid : 消息队列的标识符
msgp: 接收消息数据结构体的起始地址
msgtype: 消息类型
如果类型是0, 默认读取第一个消息
如果类型是非零值, 从第一个消息开始查找,读取指定类型的消息
msgflg: 设置阻塞标志, 0表示阻塞
返回值:
成功返回读到的实际大小, 失败返回-1
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};