#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
void sighand(int signo){
fprintf(stdout, "Thread %u in signal handler\n", (unsigned int )pthread_self());
}
void* func(void* param){
unsigned int uid = (unsigned int)pthread_self();
printf("enter thread %u\n", uid);
int rc = sleep(30);
if(rc != 0){
fprintf(stderr, "thread %u fail\n", uid);
return NULL;
}
fprintf(stdout, "thread %u success\n", uid);
return NULL;
}
void* maskedFunc(void* param){
unsigned int uid = (unsigned int)pthread_self();
printf("enter masked thread %u\n", uid);
sigset_t mask;
int rc;
sigfillset(&mask);
rc = pthread_sigmask(SIG_BLOCK, &mask, NULL);
if(rc != 0){
fprintf(stderr, "error occured in thread %u", uid);
return NULL;
}
rc = sleep(30);
if(rc != 0){
fprintf(stderr, "masked thread %u fail\n", uid);
return NULL;
}
fprintf(stdout, "masked thread %u success\n", uid);
return NULL;
}
int main(int argc, char **argv){
struct sigaction actions;
memset(&actions, 0, sizeof(actions));
sigemptyset(&actions.sa_mask);
actions.sa_flags = 0;
actions.sa_handler = sighand;
sigaction(SIGALRM, &actions, NULL);
int rc;
pthread_t pid1, pid2;
rc = pthread_create(&pid1, NULL, func, NULL);
if(rc != 0){
fprintf(stderr, "error:%s\n", strerror(rc));
}
rc = pthread_create(&pid2, NULL, maskedFunc, NULL);
if(rc != 0){
fprintf(stderr, "error:%s\n", strerror(rc));
}
sleep(3);
//send msg
pthread_kill(pid1, SIGALRM);
pthread_kill(pid2, SIGALRM);
//wait for threads to complete
pthread_join(pid1, NULL);
pthread_join(pid2, NULL);
fprintf(stdout, "main thread complete\n");
}
分享到:
相关推荐
在这个"test_pthread_kill测试程序"中,我们将深入探讨`pthread_kill`的用法、工作原理以及如何通过编写测试程序来验证其功能。 首先,`pthread_kill`函数的原型如下: ```c int pthread_kill(pthread_t thread, ...
本文档总结了 Posix Pthread API 的主要函数和使用方法,旨在帮助开发者快速掌握 Posix Pthread API 的使用。 一、 基本线程编程 在 Posix Pthread API 中,线程是轻量级的进程,可以并发执行以提高系统性能。创建...
### Posix线程编程指南 #### 1.3 线程创建属性 在Posix标准下,线程创建属性是指在使用`pthread_create()`函数...4. **`pthread_kill_other_threads_np()`**:这是一个非标准的扩展函数,用于向其他线程发送信号。
6. **信号处理**:尽管Windows系统有自己的信号机制,但pthreads-w32库也提供了POSIX风格的信号处理接口,如pthread_sigmask()和pthread_kill()。 7. **线程安全的函数封装**:pthreads-w32还提供了一些线程安全的...
3. 使用pthread_kill函数:pthread_kill函数的职责其实只是向指定的线程发送signal信号而已,并没有真正的kill掉一个线程。 4. 使用pthread_cancel函数:pthread_cancel函数可以用来取消某个线程的执行,但是它并不...
书中详细解释了POSIX线程库(pthread)的使用方法及其高级特性。 - **网络编程**:针对网络编程的需求,本书提供了丰富的示例代码来演示如何编写客户端和服务端应用程序,涵盖TCP/IP协议族的各种细节。 - **性能...
- `signal/pthread_kill/raise/sigaction` 处理和发送信号,定义信号处理行为。 - `sigsuspend` 暂停进程,直到收到指定信号。 - `sigset` 和 `sigprocmask` 用于管理信号集合和阻塞信号。 9. **网络编程**: -...
"UC.ppt"文档可能包含了这些API的详细讲解,包括使用方法、示例代码和常见问题,对于初学者和有经验的开发者都是宝贵的资源。通过阅读和实践其中的内容,开发者能够更好地驾驭Linux系统,提升其在系统编程领域的技能...
我们使用fork系统调用创建多个子进程,并使用kill系统调用来终止这些子进程。同时,我们还使用了pthread_create函数来创建新的线程。 在理解进程和线程的概念后,我们需要了解死锁的概念。死锁是指两个或多个进程在...
在Unix/Linux环境中,我们通常使用pthread_mutex_init()来初始化一个互斥体,pthread_mutex_lock()和pthread_mutex_unlock()来锁定和解锁,而pthread_mutex_destroy()则用于销毁互斥体。 在描述中的“遍历进程干掉...
在Linux操作系统中,函数库是程序开发不可或缺的部分。...在学习和使用这些函数时,理解其工作原理、正确使用方法以及潜在的陷阱至关重要。通过熟练掌握这些函数,可以提升Linux系统的管理和维护能力。
6. **线程编程**:涵盖了POSIX线程(pthread)API,如pthread_create()、pthread_join()、pthread_mutex_t和pthread_cond_t等,以及线程同步和互斥锁的使用。 7. **其他高级话题**:如程序异常处理、程序调试工具...
理解这些系统调用的工作原理和使用方法对于编写高效、可靠的程序至关重要。 2. **进程管理**:在Linux中,进程是资源分配的基本单位。内核API提供了创建、销毁、控制进程的各种接口,如`fork()`, `wait()`, `...
在Linux中,我们可以使用`pthread_create`函数创建新线程,`pthread_join`等待线程结束,而`pthread_mutex`和`pthread_cond`系列函数则用于线程同步和通信,防止数据竞争问题。 异步I/O是另一种提高程序性能的方法...
5. Pthread:pthread是Linux下的多线程API,提供了一种在同一进程中创建并发执行线程的方法。`pthread_create`, `pthread_join`, `pthread_mutex`, `pthread_cond`等函数用于线程的创建、同步和通信。 6. Signal:...