signal
信号:
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
int sig:信号
void (*func)(int)))(int):回调函数
信号等待函数
#include <unistd.h>
int pause(void);
信号集清空
#include <signal.h>
int sigemptyset(sigset_t *set);//信号集清空
sigset_t set;
信号集添加
#include <signal.h>
int sigaddset(sigset_t *set, int signum);
信号集删除
#include <signal.h>
int sigdelset(sigset_t *set, int signum);
信号动作 //其实就是一个过滤系统,用sigaddset添加后,他就能先挡在外面,干自//己的,干完才放行
int sigprocmask(int how, const sigset_t *restrict set,
sigset_t *restrict oset);
2.SIG_UNBLOCK: 非阻塞动作 将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
3.SIG_SETMASK:设置当前信号掩码为参数newset所指向的信号集中所包含的信号。
sigqueue-->跟kill一样,但它可以额外带参数
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
pid_t pid:进程PID
int sig :信号
const union sigval value:额外值
union sigval {
int sival_int;
void *sival_ptr;
};
返回值: 成功:0
失败:-1
//被定义的信号不会发生嵌套
//用于信号接收时,排队接收
//而阻止插队接收信号的发生
#include <signal.h>
int sigaction(int sig, const struct sigaction *restrict act,
struct sigaction *restrict oact);
int sig:信号
const struct sigaction *restrict act:新设置的动作
struct sigaction *restrict oact:目前的动作
返回值: 成功:0
失败:-1
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction 类型用来描述对信号的处理,定义如下:
struct sigaction
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
在这个结构体中,成员 sa_handler 是一个函数指针,其含义与 signal 函数中的信号处理函数类似。成员
sa_sigaction 则是另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。当 sa_flags 成员的值
包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理
函数。在某些系统中,成员 sa_handler 与 sa_sigaction 被放在联合体中,因此使用时不要同时设置。
sa_mask 成员用来指定在信号处理函数执行期间需要被屏蔽的信号,特别是当某个信号被处理时,它自身会被
自动放入进程的信号掩码,因此在信号处理函数执行期间这个信号不会再度发生。
sa_flags 成员用于指定信号处理的行为,它可以是一下值的“按位或”组合。
◆ SA_RESTART:使被信号打断的系统调用自动重新发起。
◆ SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
◆ SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵
尸进程。
◆ SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
◆ SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
◆ SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal 信号传过来的参数*/
void *si_ptr; /* POSIX.1b signal 信号传过来的参数*/
system V IPC
ipcs -l 查看IPC
Shared Memory Limits:共享内存
Semaphore Limits:信号量
Messages Limits:消息队列
共享内存:
高效,直接操作物理内存,不需要任何的拷贝
向内核申请一块内存,映射到进程自身的虚拟地址空间中
可以直接读写这个进程中的空间,提高效率
申请并新建一个共享内存
int shmget(key_t key, size_t size, int shmflg);
返回值: 成功:返回申请到的内存ID
失败:-1
key_t key:内存的键值
size_t size:大小
int shmflg:权限标志IPC_CREAT
内存映射
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
返回值:成功:映射的地址:
const void *shmaddr:映射起始地址:
int shmflg:权限标志 0代表可读可以写
删除共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int shmid:申请到的内存ID
int cmd:命令 IPC_RMID(删除)
struct shmid_ds *buf:0