linux进程,作业,守护进程,进程间同步

news/2024/7/7 10:39:04

ps axj命令查看系统中的进程。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息;

凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程;

COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel;

udevd负责维护/dev目录下的设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件,可以看出,守护进程通常采用以d结尾的名字,表示Daemon;

创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader;

创建守护进程;

线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项;

终止线程

如果需要只终止某个线程而不终止整个进程,可以有三种方法:

  • 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit

  • 一个线程可以调用pthread_cancel终止同一进程中的另一个线程。

  • 线程可以调用pthread_exit终止自己。


线程可以调用pthread_join得到start_routine的返回值;

 

调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:

  • 如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。

  • 如果thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED

  • 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。

如果对thread线程的终止状态不感兴趣,可以传NULLvalue_ptr参数。

一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL。对一个尚未detach的线程调用pthread_joinpthread_detach都可以把该线程置为detach状态,也就是说,不能对同一线程调用两次pthread_join,或者如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

#include <pthread.h>

int pthread_detach(pthread_t tid);

对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样读-修改-写”三步操作组成一个原子操作要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作

Mutex用pthread_mutex_t类型的变量表示,可以这样初始化和销毁:

#include <pthread.h>

int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
       const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

Mutex的加锁和解锁操作可以用下列函数:
#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

一个线程可以调用pthread_mutex_lock获得Mutex,如果这时另一个线程已经调用pthread_mutex_lock获得了该 Mutex,则当前线程需要挂起等待,直到另一个线程调用pthread_mutex_unlock释放Mutex,当前线程被唤醒,才能获得该 Mutex并继续执行。

如果一个线程既想获得锁,又不想挂起等待,可以调用pthread_mutex_trylock,如果Mutex已经被另一个线程获得,这个函数会失败返回EBUSY,而不会使线程挂起等待

想尽方法仅仅执行一条指令,保证操作原子性;

用pthread_mutex_trylock调用代替pthread_mutex_lock调用,以免死锁;

 


http://www.niftyadmin.cn/n/604166.html

相关文章

中国十大城市美女(经典套图)

NO.1 大连美女 豪放婉约 漂亮指数:95 东北女子向来以白面长身著称。大连美眉则无疑集东北女性的精华于一身。与江南女子相比&#xff0c;大连美眉也许婉约不够&#xff0c;但却多了一份豪气&#xff1b;与东北的其他内陆城市女人相比&#xff0c;大连美眉身上又多了一些清丽和…

.net wap 开发:在.net中写自己的objectlist

使用.net开发wap的都会为这个工具的强大所震撼&#xff0c;忘掉在php&#xff0c;asp&#xff0c;jsp中的write wml语法吧&#xff0e;但是&#xff0c;美中不足的是其中的类web中的datagrid控件objectlist没有他所宣称的那么方便&#xff0c;至少不符合中国人的习惯&#xff0…

概率分布分位点_分位数与QQ图

常说的QQ图究竟是怎么来的&#xff0c;QQ图有何意义。今天我们来了解QQ图~1.基础知识分位数(Quantile)&#xff0c;亦称分位点&#xff0c;是指将一个随机变量的概率分布范围分为几个等份的数值点&#xff0c;常用的有中位数(即二分位数)、四分位数、百分位数等。在实际运用中&…

TVB十大女星比美十大名花

1、兰花&#xff1a;宣萱折茎聊可佩&#xff0c;入室自成芳。萱宣的美正如兰花的香&#xff0c;虽然淡淡但是持久。从“宠物情缘”到寻秦记再到“憨夫成龙”&#xff0c;她的每部戏总是那么的深入人心&#xff0c;令人回味。大多数男性的TVBfans可能更喜欢她&#xff0c;因为她…

idea 连接云mysql_idea配置MySQL数据库异常处理

配置MySQL数据库过程中经常出现的问题&#xff0c;在这里给大家说一下idea配置MySQL数据库页面常见问题一&#xff1a;数据库驱动driver-class-name设置错误MySQL数据库之前用的比较多的时MySQL5.6/5.7版本&#xff0c;再后来就是现在用的比较多的MySQL8.0.*的版本两个版本的驱…

假期安排计划

7.18到8.18是学校规定的假期。 我按照往常的习惯&#xff0c;还是不回家了。 必须给这个假期订立一个计划&#xff0c;否则会过得浑浑噩噩。 基本指导原则是: 按时作息&#xff0c;工作学习不要过度&#xff0c;当然休闲也要适当。 具体的计划: 7:30起床&#xff0c;8:00之…

我的世界java版gamemode指令_【服务器相关】【求助!】关于服务器中使用gamemode等命令错误。...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼事情是这样的我自己开个服务器玩玩&#xff0c;装了一堆插件给自己了一个op不知道怎么&#xff0c;TMI内置修改器每一个指令都不能用了&#xff0c;客户端里红字提示an internal error occurred while attempting to perform this …

orc识别较慢_关于半自动标注工具PPOCRLabel运行速度由快逐渐变慢的问题

1.问题描述在使用PPOCRLabel进行自动标注的过程中&#xff0c;发现文本检测模块运行速度由最开始的每帧三百多毫秒逐渐变为每帧数秒&#xff0c;且速度还在不断变慢中。初步定位为后处理DBPostProcess耗时在增加&#xff0c;db模型预测速度正常。其余方向分类和文本识别模块运行…