oguro的博客

留下思索,分享感悟

linux多线程结束时,回收子进程问题

当已经有SIGCHLD信号时,我们调用waitpid是可以立即返回的。所以经常在SIGCHLD处理程序中调用waitpid函数,这样就可以期望他总能立即返回,但是如果在执行SIGCHLD处理程序期间又有子进程终止,因为unix不对信号排队,如果多于一个子进程终止,则会导致信号丢失,在这种情况下,如...

2016-12-26 20:25:06

阅读数:345

评论数:0

linux将参数传递到信号处理函数

普通的信号处理函数,在注册时一般为:singal(信号,信号处理函数),此种都不能把需要的参数传递到处理函数里面。 如果想将参数也传递到信号处理函数里面,需要用到sigaction结构体。注册函数为sigaction函数。 发送信号并传递信息用sigqueue函数。 #incl...

2016-12-26 20:21:21

阅读数:2417

评论数:0

linux文件锁

文件锁 借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。 fcntl函数: 获取、设置文件访问控制属性。 int fcntl(int fd, int cmd, ... /* arg */ ); 参2: F_SETLK (st...

2016-12-25 12:30:13

阅读数:265

评论数:0

linux进程互斥锁

进程间同步 互斥量mutex 进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。 主要应用函数: pthread_mutexattr_t mattr 类型: 用于定义mutex锁的...

2016-12-25 12:27:30

阅读数:709

评论数:0

linux信号量

信号量 进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行...

2016-12-25 12:23:21

阅读数:283

评论数:0

linux条件变量

条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timed...

2016-12-25 12:20:35

阅读数:223

评论数:0

linux读写锁

读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性: 1. 读写锁是“写模式加锁”时, 解锁前,所有对该锁加锁的线...

2016-12-25 12:15:04

阅读数:337

评论数:0

linux互斥锁

互斥量mutex Linux中提供一把互斥锁mutex(也称之为互斥量)。 每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。 资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。   但,应注...

2016-12-25 12:12:55

阅读数:341

评论数:0

linux线程属性

线程属性 本节作为指引性介绍,linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。 ty...

2016-12-25 10:28:16

阅读数:170

评论数:0

linux线程控制原语2

pthread_exit函数 将单个线程退出 void pthread_exit(void *retval); 参数:retval表示线程退出状态,通常传NULL 思考:使用exit将指定线程退出,可以吗? 【pthrd_exit.c】 #include #include #inclu...

2016-12-25 10:26:09

阅读数:185

评论数:0

linux线程控制原语1

pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值:成功:0; 失败:无! 线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现 线程...

2016-12-25 10:21:08

阅读数:310

评论数:0

linux守护进程

守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:...

2016-12-24 15:38:13

阅读数:178

评论数:0

linux会话

会话 创建会话 创建一个会话需要注意以下6点注意事项: 1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header) 2. 该进程成为一个新进程组的组长进程。 3. 需有root权限(ubuntu不需要) 4. 新会话丢弃原有的控制终端,该会话没有控制终端 ...

2016-12-24 15:35:20

阅读数:1291

评论数:0

linux进程组操作函数

进程组操作函数 getpgrp函数 获取当前进程的进程组ID pid_t getpgrp(void); 总是返回调用者的进程组ID getpgid函数 获取指定进程的进程组ID pid_t getpgid(pid_t pid);  成功:0;失败:-1,设置errno 如果pid =...

2016-12-24 15:33:17

阅读数:249

评论数:0

linux的SIGCHLD信号

SIGCHLD信号 SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 借助SIGCHLD信号回收子进程 #include #include #include #include #include #in...

2016-12-24 11:26:32

阅读数:3368

评论数:0

linux的信号捕捉函数详解

信号捕捉 signal函数 注册一个信号捕捉函数: typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 该函数由ANSI定义,由于历史原因在不同版本的Unix和...

2016-12-24 10:37:54

阅读数:2974

评论数:1

linux信号集操作函数

信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。 信号集设定 sigset_t  set; // typedef unsigned long sigset_t; ...

2016-12-24 10:14:26

阅读数:502

评论数:0

linux共享存储映射mmap

共享存储映射 文件进程间通信 使用文件也可以完成IPC,理论依据是,fork后,父子进程共享文件描述符。也就共享打开的文件。    练习:编程测试,父子进程共享打开的文件。借助文件进行进程间通信。    【fork_shared_fd.c】 /* *父子进程共享打开的文件描述符----...

2016-12-23 17:59:24

阅读数:1397

评论数:0

linux管道pipe详解

管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用,一个表示读端,一个表示写端。 3. 规定数据从管道的写端流入管道,从读端流出。 ...

2016-12-23 17:16:36

阅读数:39280

评论数:5

linux的waitpid函数

waitpid函数 作用同wait,但可指定pid进程清理,可以不阻塞。     pid_t waitpid(pid_t pid, int *status, in options); 成功:返回清理掉的子进程ID;失败:-1(无子进程) 特殊参数和返回情况: 参数pid:  > ...

2016-12-23 16:53:54

阅读数:267

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭