FIFO:有名管道
1,命令:mkfifo name.fifo
2, 函数:int mkfifo(const char path, mode_t mode);
当以只写方式打开,读端不存在,则阻塞在open,直到有读端
当以只读方式打开,写端不存在,则阻塞在open,直到有写端
大小也是64K,数据存放在内存中
当写入数据小于64K时,会尝试写入,如能全部写入,则写入,如不能,等待直到能全部写入
当读出的数据小于管道现有的数据,读出所需要的数据,小于现有数据,全部读出
若为空,阻塞
在读写过程中,读端关闭,写端收到SIGPIPE
在读写过程中,写端关闭,读端读出所有数据,直到为空
在open时,加入O_NONBLOCK为非阻塞模型,没有写端,读端可以成功打开
没有读端,写端无法打开
当fifo有数据,读端读出数据,
当fifo没有数据,a,写端存在,返回-1表示,无数据可读
b,写端不存在,返回0表示写端不存在
当fifo有足够空间,写入全部,返回写入字符的个数
当fifo没有足够空间,写入可写入数据,并且返回写入数据的大小
当fifo没有空间,返回-1
当读写端同事存在时,关闭写端,读端操作返回0
当读写端同时存在时,关闭读端,写端收到SIGFIFO
信号:
信号时在软件层次上对中断机制的一种模拟,是一种异步通信方式
信号处理方式:默认方式,忽略信号(SIGKILL,SIGSTOP不合忽略)
捕捉信号:自定义处理方式
SIGKILL:不可以被阻塞,处理,忽略
SIGSTOP:不可以被阻塞,处理,忽略
int kill(pid_t pid, int sig);
pid:正数,表示该id的进程
0,当前进程组中的进程
-1:发送给进程表中的所有进程
int raise(int sig);
向自己发送一个信号
alarm(int seconds)不阻塞,在seconds秒后自动发出一个SIGALRM信号
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
which:计时策略,ITIMER_REAL:CPU时间,ITIMER_VIRTUAL:进程时间, ITIMER_PROF:都行
该函数会在设定的时间自动发出一个SIGALRM信号
struct itimerval结构体:
- truct itimerval {
-
struct timeval it_interval; /* next value */
-
struct timeval it_value; /* current value */
-
};
-
-
struct timeval {
-
long tv_sec; /* seconds */
-
long tv_usec; /* microseconds */
-
};
pause()挂起进程,会被任意信号唤醒
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
典型用法:
- signal(SIGNUM, myfunc);//用于注册,当捕获到SIGNUM信号时,会由myfunc函数处理
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
典型用法:
- struct sigaction act;
-
sigaction(SIGALRM, NULL, &act);//先获取
-
act.sa_handler = my_func;//设置相关项
-
sigaction(SIGALRM, &act, NULL);//在设置
阅读(1396) | 评论(1) | 转发(0) |