RTT中的POSIX支持

发布于 2016-11-13 23:32:22
标题改个名字,原名称是《RTT中的signal支持》,因为在持续性的做POSIX相关的工作,所以其他部分也做个相应的记录。

1. POSIX signal的情况
-----
按照标准的signal情况,<见POSIX>,语义主要包括几个:

int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
void (*signal(int sig, void (*func)(int)))(int);
/* 用于设置关联的signal处理函数(action) */

int kill(pid_t, int); -- 向进程发送signal,RTT环境下不会支持。
int raise(int sig); -- 向本身发送signal,在RTT环境下由当前任务进行处理;等同于 pthread_kill(pthread_self(), sig);
int pthread_kill(pthread_t thread, int sig); -- 向某pthread发送signal

多个signal相关的sigset
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

核心部分在于,可以通过sigaction或signal函数把一个signal处理函数挂接到对应的signal上。当这个signal触发时(通过kill或raise等API),即使进程处于挂起状态,它也应该被唤醒起来,去执行对应的signal action。然后结束后,再返回原有的状态。

而在触发signal给任务A时,又有几种状态:
1. 触发给任务本身,直接处理,然后返回;
2. 触发给任务,任务处于sigwait状态。
3. 任务处于就绪状态;
4. 任务处于挂起状态;

如果任务A处于挂起状态,则应该唤醒任务,构造栈帧,由任务A去执行signal handler[马上执行,任务优先级顺延任务A的优先级]。执行结束后,返回上次的运行点。

signals参考链接:
http://pubs.opengroup.org/onlinepubs/00 ... nal.h.html
http://www.enderunix.org/docs/signals.pdf

查看更多

关注者
0
被浏览
2.2k
3 个回答
bernard
bernard 2016-11-26
Linux的signals处理可以见这篇文档:


Linux的signals处理因为程序存在用户空间,而sigaction主要是在用户空间发生,所以它是每次在程序从内核空间返回到用户空间是检查是否有signals需要处理,然后再返回到用户态执行相应的sigaction。
bernard
bernard 2016-12-26
2. POSIX pipe
-----

pipe调用本身的语义,
http://pubs.opengroup.org/onlinepubs/96 ... /pipe.html

主体部分是这个,
The pipe() function shall create a pipe and place two file descriptors, one each into the arguments fildes[0] and fildes[1], that refer to the open file descriptions for the read and write ends of the pipe. The file descriptors shall be allocated as described in File Descriptor Allocation. The O_NONBLOCK and FD_CLOEXEC flags shall be clear on both file descriptors. (The fcntl() function can be used to set both these flags.)

Data can be written to the file descriptor fildes[1] and read from the file descriptor fildes[0]. A read on the file descriptor fildes[0] shall access data written to the file descriptor fildes[1] on a first-in-first-out basis. It is unspecified whether fildes[0] is also open for writing and whether fildes[1] is also open for reading.

A process has the pipe open for reading (correspondingly writing) if it has a file descriptor open that refers to the read end, fildes[0] (write end, fildes[1]).

The pipe's user ID shall be set to the effective user ID of the calling process. <单用户,单进程系统,这部分不支持>

The pipe's group ID shall be set to the effective group ID of the calling process. <单用户,单进程系统,这部分不支持>

Upon successful completion, pipe() shall mark for update the last data access, last data modification, and last file status change timestamps of the pipe.

简单的说就是,调用pipe调用后,出两个fd,一个是read,一个是write。这部分和rt-thread v2.1.0里的定义实际上是完全不一样的。rt-thread v2.1.0里的pipe更类似于自己的 API(也确实是,例如rt_pipe_read/rt_pipe_write;rt_pipe_create则直接创建出一个pipe的设备出来,然后再进行(设备)打开,读写操作)

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友