一,精灵进程(守护进程)
1,daemon(2)函数原型
用来将程序转变为daemon进程,转到后台运行(daemon和&是不同的,&的进程仍然依赖父进程)。我们经常使用daemon(0,0)来将程序转变为守护进程来运行;
返回值:
=0成功。
=-1失败。
#include <unistd.h>
int daemon(int nochdir, int noclose);
int nochdir//指定是否切换工作路径到 “ / ” 根目录
0 改为根目录。
1 不更改工作目录。
int noclose//指定是否关闭标准输入,标准输出,标准出错(即重定向到/dev/null)
0 关闭标准输出,标准出错,重定向到/dev/null
1 不关闭标准输出,标准出错。
二,syslod协议
1,openlog(3)函数原型
用来打开日志设备,以供读取和写入,与文件系统调用的open类似;调用openlog是可选择的。如果不调用openlog函数,则在第一次调用syslog时,自动调用openlog函数。
#include <syslog.h>
void openlog(const char *ident, int option, int facility);
const char *ident//是一个标记,ident 所表示的字符串将固定的加在每行日志的前面一标识这个日志,通常就写成当前程序的名称以作标记。好让我们知道一个日志是哪个程序的输出,即相当于我们给一个进程取的一个小名。
int option//指定openlog函数和接下来调用的syslog函数的控制标志。可以取以下值:
LOG_CONS 如果将信息发送给 syslogd 守护进程时发生错误,直接将相关信息输出到终端。
LOG_NDELAY 立即打开与系统日志的连接(通常情况下,只有在产生第一条日志信息的情况下才会打开与日志系统的连接)。
LOG_ODELAY 类似于 LOG_NDELAY 参数,与系统日志的连接只有在 syslog 函数调用时才会创建。
LOG_PERROR 在将信息写入日志的同时,将信息发送到标准错误输出。
LOG_PID 每条日志信息中都包含进程号。
int facility//指定记录消息程序的类型,与 syslogd 守护进程的配置文件 syslog.conf 中的 facility 对应。可取如下值:
LOG_AUTH 认证系统(login、su、getty等)。
LOG_AUTHPRIV 同 LOG_AUTH 但只登陆到所选择的单个用户可读的文件中。
LOG_CRON cron 守护进程。
LOG_DAEMON 其他系统守护进程,如 routed。
LOG_FTP 文件传输协议:ftpd、tftpd。
LOG_KERN 内核产生的消息。
LOG_LPR 系统打印机缓冲池:lpr、lpd。
LOG_MAIL 电子邮件系统。
LOG_NEWS 网络新闻系统。
LOG_SYSLOG 由 syslogd(8)产生的内部消息。
LOG_USER 随机用户进程产生的消息。
LOG_UUCP UUCP 子系统。
LOG_LOCAL0 ~ LOG_LOCAL7 本地使用保留。
2,syslog(3)函数原型
用来写入日志,与文件系统调用printf使用方法类似,但在前面指定日志级别。
#include <syslog.h>
void syslog(int priority, const char *format, ...);
int priority//表示消息的级别,与 syslogd 守护进程的配置文件 syslog.conf 中的 level 对应。可取如下值:
LOG_EMERG 紧急情况。
LOG_ALERT 应该被立即改正的问题,如系统数据库破坏。
LOG_CRIT 重要情况,如硬盘错误。
LOG_ERR 错误。
LOG_WARNING 警告信息。
LOG_NOTICE 不是错误情况,但是可能需要处理。
LOG_INFO 情报错误。
LOG_DEBUG 包含情报的信息,通常指在调试一个程序时使用。 none和*两个等级,`none`屏蔽所有来自指定设备的信息,通常用来排错,而`*`是指除了none之外的所有级别。
const char *format//日志要打印的内容,和printf()中的一样。
...//打印的日志所需要的参数。即printf()中的%d,%f填什么。
3,closelog(void)函数原型
关闭日志设备,与文件系统调用的close类似;调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。
#include <syslog.h>
void closelog(void);
三,多线程基本
1,pthread_create(4)函数原型
pthreand_create()用来创建一个线程,并执行第三个参数start_routine所指向的函数。
返回值:
0成功
其他失败
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
pthread_t *thread//是一个pthread_t类型的指针,用来返回线程号tid。线程可以通过pthread_self()函数来获取自己的tid,即线程ID。
const pthread_attr_t *attr//是线程的属性,是由一个结构体包含的所有属性。结构体 pthread_attr_t
void *(*start_routine)//start_routine是一 个函数指针,它指向的函数原型是 void *func(void *),即子线程需要执行的任务是什么。
(void *), void *arg//给上面start_routine的函数的参数,如果需要传多个参数进去,那么可以使用结构体打包送进函数去。
typedef struct
{
int detachstate;//线程的分离状态,默认是joinable可会合状态。需要主线程调用 pthread_join 等待它退出
//否则内存资源不会释放,所以我们一般会设置成为detach相分离状态。
//1. 线程里面调用 pthread_detach(pthread_self()) 这个方法最简单
//2. 在创建线程的属性设置里设置PTHREAD_CREATE_DETACHED属性
int schedpolicy;// 线程调度策略
struct sched_param schedparam;// 线程的调度参数
int inheritsched;// 线程的继承性
int scope;// 线程的作用域
size_t guardsize;// 线程栈末尾的警戒缓冲区大小
int stackaddr_set;
void * stackaddr;// 线程栈的位置
size_t stacksize;// 线程栈的大小
}pthread_attr_t;//这个结构体很重要,是线程的基本设置。
2,pthread_attr_init(1)函数原型
用来初始化pthread_attr_t结构体。
返回值:
0init成功
其他失败,返回错误值。
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
pthread_attr_t *attr//对应需要初始化的线程的结构体指针,结构体地址。
3,pthread_attr_setdetachstate(2)函数原型
用来设置对应线程pthread_attr_t结构体中的分离状态属性。
返回值:
0成功
-1失败,返回错误值。
#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);(设置)
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);(获取)
pthread_attr_t *attr//对应线程的结构体地址,或结构体指针。
int detachstate//想要设置的状态。线程默认是可会和状态
PTHREAD_CREATE_DETACHED(相分离状态)
PTHREAD_CREATE_JOINABLE(可会和状态)
4,pthread_attr_setstacksize(2)函数原型
用来设置对应线程pthread_attr_t结构体中的栈大小的状态属性。
返回值:
0成功
-1失败,返回错误值。
#include <pthread.h>
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);(设置)
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);(获取)
pthread_attr_t *attr//对应线程的结构体地址,或结构体指针。
size_t stacksize//栈的大小。
5,pthread_attr_destroy(1)函数原型
用来销毁pthread_attr_t结构体。用来释放线程结构体的资源(是线程结构体,而不是释放了线程,所以这个结构体在被释放后其对应的线程仍然可以正常工作)。
返回值:
0释放成功
其他失败,返回错误值。
#include <pthread.h>
int pthread_attr_destroy(pthread_attr_t *attr);
pthread_attr_t *attr//对应需要释放的线程的结构体指针,结构体地址。
6,pthread_join(2)函数原型
这个函数的作用是等待一个线程的结束。是一个阻塞函数。pthread_join()是一个线程阻塞函数,调用它的函数将一直等到被等待的线程结束为止,类似于进程中的waitpid()函数,但有区别。
返回值:
0成功
其他失败。
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
pthread_t thread//等待结束的线程对应的pthread_t类型的变量thread(即tid),线程号。
void **retval//读取线程退出的携带信息,那么线程thread的返回值存储在该指针指向的位置。该返回值可以是由pthread_exit()给出的值,或者该线程被取消而返回PTHREAD_CANCELED。
7,pthread_exit(1)函数原型
这个函数应在一个子线程中去使用,作用是使这个线程结束。如果在主线程中使用,子线程的资源不会被释放,会成为僵死线程。
返回值:无
#include <pthread.h>
void pthread_exit(void *retval);
void *retval//是函数的返回代码,只要pthread_join中的第二个参数value_ptr不是NULL,这个值将被传递给value_ptr。
四,锁基本
1,pthread_mutex_init(2)函数原型
用来初始化一个锁结构。以动态方式创建互斥锁,默认是创建快速互斥锁,此函数执行后,返回0为正常,其他值均为发生错误,同时函数结束后,他只是创建,初始化了一个未上锁的互斥锁。所以我们后来还需要调用pthread_mutex_lock()等函数来上锁。
返回值:
0成功
其他失败。
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;(这个在头文件里,可以看到初始化的值是多少)
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
pthread_mutex_t *restrict mutex//需要初始化的锁结构的结构体地址,结构体指针。
const pthread_mutexattr_t *restrict attr//参数attr指定了新建互斥锁的属性。如果参数attr为空(NULL),则使用默认的互斥锁属性,默认属性为快速互斥锁。互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。
PTHREAD_MUTEX_TIMED_NP 这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队 列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP 嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果 是不同线程请求,则在加锁线程解锁时重新竞争。
PTHREAD_MUTEX_ERRORCHECK_NP 检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与 PTHREAD_MUTEX_TIMED_NP 类型动作相同。这样保证当不允许多次加锁时不出现最简单情况下的死锁。
THREAD_MUTEX_ADAPTIVE_NP 适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
2,pthread_mutex_lock(1)函数原型(阻塞锁)
如果 mutex 指向的互斥锁当前没有被锁定,则调用线程将获得锁,并继续执行。如果 mutex 指向的互斥锁已经被其他线程锁定,则调用线程将被阻塞,直到互斥锁被解锁。
返回值:
0成功
其他失败。
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
pthread_mutex_t *mutex//锁的地址,是一个指针。
3,pthread_mutex_trylock(1)函数原型(非阻塞锁)
如果 mutex 指向的互斥锁当前没有被锁定,则调用线程将获得锁(返回值为0),并继续执行。如果 mutex 指向的互斥锁已经被其他线程锁定,则调用线程不会被阻塞(返回值非0),会跳过临界区继续执行(即lock和unlock中间这部分会被跳过)。
返回值:
0成功
其他失败。
#include <pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);
pthread_mutex_t *mutex//锁的地址,是一个指针。
4,pthread_mutex_unlock(1)函数原型
用来解除一个锁。我们调用lock后必须用unlock接触锁,这是一个好习惯,要注意,解锁不等于销毁了锁,锁的内存此时还没有被释放。
返回值:
0成功
其他失败。
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
pthread_mutex_t *mutex//锁的地址,是一个指针。
5,pthread_mutex_destroy(1)函数原型
用来销毁一个锁结构。
返回值:
0成功
其他失败。
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_t *mutex//锁的地址,是一个指针。
185

被折叠的 条评论
为什么被折叠?



