文件锁
理解 flock 和 fcntl
信号量
sigprocmask的参数意义
参考:man SIGPROCMASK
siglongjmp与sigsetjmp
int sigsetjmp(sigjmp_buf env, int savesigs)
设置跳转点,类似于goto标签,等到siglongjmp会跳转到sigsetjmp之后的代码,同时恢复sigsetjmp前的env,即进程上下文环境
savesigs设为非0时会恢复之前信号掩码,savesigs为0则不恢复。
sigsetjmp的正常的返回值为0,由siglongjmp跳转到的时候返回值等于siglongjmp的val
void siglongjmp(sigjmp_buf env, int val)
恢复到env时的指令地址及环境,同时设置val
信号处理函数的默认原型void sig_handler(int sig_num)
sig_num代表具体的信号编号
#include<setjmp.h>
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
static sigjmp_buf jmpbuf;
static volatile sig_atomic_t jumpok=0;
static void hd(int sign)
{
printf("sign=%d\n",sign);
if(!jumpok)return;
siglongjmp(jmpbuf,3);
}
int main()
{
printf("SIGINT=%d\n",SIGINT);
struct sigaction act;
act.sa_flags=0;
act.sa_handler=hd;
sigemptyset(&act.sa_mask);
sigaction(SIGINT,&act,NULL);//仅设置SIGINT的处理函数
int ret;
puts("before sigsetjmp");
ret=sigsetjmp(jmpbuf,2333);
if(ret)printf("ret=%d,return to main loop\n",ret);
puts("after sigsetjmp");
jumpok=1;
while(1);
return 0;
} 获取系统时间
struct timeval tv; gettimeofday(&tv,NULL); long now=tv.tv_sec*1000+tv.tv_usec; //微秒级系统时间
获取线程uid
#include <sys/syscall.h>
#define gettidv1() syscall(__NR_gettid)
#define gettidv2() syscall(SYS_gettid)
printf("The ID of this thread is: %ld\n", (long int)gettidv1());// 最新的方式
printf("The ID of this thread is: %ld\n", (long int)gettidv2());// traditional form 


京公网安备 11010502036488号