Linux系统编程
线程的创建
每一个线程都有一个唯一的线程 ID,ID 类型为 pthread_t,这个 ID 是一个无符号长整形数,如果想要得到当前线程的线程 ID,可以调用如下函数:
pthread_t pthread_self(void); // 返回当前线程的线程ID
在一个进程中调用线程创建函数,就可得到一个子线程,和进程不同,需要给每一个创建出的线程指定一个处理函数,否则这个线程无法工作。
#includeint pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); // Compile and link with -pthread, 线程库的名字叫pthread, 全名: libpthread.so libptread.a
参数:
thread: 传出参数,是无符号长整形数,线程创建成功,会将线程 ID 写入到这个指针指向的内存中
attr: 线程的属性,一般情况下使用默认属性即可,写 NULL
start_routine: 函数指针,创建出的子线程的处理动作,也就是该函数在子线程中执行。
arg: 作为实参传递到 start_routine 指针指向的函数内部
返回值:线程创建成功返回 0,创建失败返回对应的错误号
启动程序之后,入口main函数,在主线程创建子线程,子线程创建出来后执行任函数callback,从for循环向下执行,执行完后子线程退出。
主线程从main函数一直向下,直到main执行完毕。主线不会执行子线程的任务函数,它是在子线程里处理的。
错误原因是因为编译器链接不到线程库文件(动态库),需要在编译的时候通过参数指定出来,动态库名为 libpthread.so 需要使用的参数为 -l,根据规则掐头去尾最终形态应该写成:-lpthread(参数和参数值中间可以有空格)。正确的编译命令为:
结论:
1.创建一个线程需要调用线程函数,函数执行成功后,得到的是子线程,子线程执行的任务第三个参数执行的任务函数
2.主线程执行完后会释放对应的虚拟地址空间,可以让主线程睡一会。
线程退出
在编写多线程程序的时候,如果想要让线程退出,但是不会导致虚拟地址空间的释放(针对于主线程),我们就可以调用线程库中的线程退出函数,只要调用该函数当前线程就马上退出了,并且不会影响到其他线程的正常运行,不管是在子线程或者主线程中都可以使用。
参数:线程退出的时候携带的数据,当前子线程的主线程会得到该数据。如果不需要使用,指定为 NULL。
文件IO之open函数
查看open函数 man 2 open,需要用到以下头文件
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode)
int creat(const char *pathname, mode_t mode);
参数 flags 是通过 O_RDONLY, O_WRONLY 或 O_RDWR (指明文件是以只读 ,只写或读写方式打开的) 与下面的零个或多个可选模式 按位 -or 操作得到的。
mode 只有 当 在 flags 中 使用 O_CREAT 时 才 有效 , 否则 被 忽略.
creat 相当 于 open 的 参数 flags 等于 O_CREAT|O_WRONLY|O_TRUNC.