1) 创建/获取共享内存
int shmget (key_t key, size_t size, int shmflg);
- A. 该函数以key参数为键值创建共享内存,或获取已有的共享内存。
- B. size参数为共享内存的字节数, 建议取内存页字节数(4096)的整数倍。
若希望创建共享内存,则必需指定size参数。
若只为获取已有的共享内存,则size参数可取0。- C. shmflg取值:
0 - 获取,不存在即失败。
IPC_CREAT - 创建,不存在即创建,
已存在即获取,除非…
IPC_EXCL - 排斥,已存在即失败。- D. 成功返回共享内存标识,失败返回-1。
2) 加载共享内存
void* shmat (int shmid, const void* shmaddr,int shmflg);
- A. 将shmid参数所标识的共享内存,映射到调用进程的地址空间。
- B. 可通过shmaddr参数人为指定映射地址,也可将该参数置NULL,由系统自动选择。
- C. shmflg取值:
0 - 以读写方式使用共享内存。
SHM_RDONLY - 以只读方式使用共享内存。
SHM_RND - 只在shmaddr参数非NULL时起作用。
表示对该参数向下取内存页的整数倍,作为映射地址。- D. 成功返回映射地址,失败返回-1。
- E. 内核将该共享内存的加载计数加1
3) 卸载共享内存
int shmdt (const void* shmaddr);
- A. 从调用进程的地址空间中,取消由shmaddr参数所指向的,共享内存映射区域。
- B. 成功返回0,失败返回-1。
- C. 内核将该共享内存的加载计数减1。
- 4) 销毁/控制共享内存
4)wait函数
pid_t wait(int *status)
功能:
阻塞并等待子进程退出
回收子进程残留资源
获取子进程结束状态(退出原因)
返回值:
成功:清理掉的子进程ID
失败:-1 (没有子进程)
参数:子进程的退出状态 -- 传出参数
1. WIFEXITED(status):为非0 → 进程正常结束
WEXITSTATUS(status):
如上宏为真,使用此宏 → 获取进程退出状态 (exit/return)的参数)
2. WIFSIGNALED(status):为非0 → 进程异常终止
WTERMSIG(status):
如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。
原文链接:https://blog.csdn.net/zxy131072/article/details/89477344
5)sighandler_t signal (int signum,sighandler_t handler);
- signum - 信号码,也可使用系统预定义的常量宏,如SIGINT等。
- handler - 信号处理函数指针或以下常量: SIG_IGN: 忽略该信号;SIG_DFL: 默认处理。
- 成功返回原来的信号处理函数指针或SIG_IGN/SIG_DFL常量,
- 失败返回SIG_ERR。
- 1) 在某些Unix系统上,通过signal函数注册的信号处理函数只一次有效。
即内核每次调用信号处理函数前,会将对该信号的处理自动恢复为默认方式。
为了获得持久有效的信号处理,可以在信号处理函数中再次调用signal函数,重新注册一次。
6)int kill (pid_t pid, int sig);
- #include <signal.h>
成功返回0,失败返回-1。
pid > 0 - 向pid进程发送sig信号。
pid = 0 - 向同进程组的所有进程发送信号。
pid = -1 - 向所有进程发送信号,
前提是调用进程有向其发送信号的权限。
pid < -1 - 向绝对值等于pid的进程组发信号。
0信号为空信号。
若sig取0,则kill函数仍会执行错误检查,
但并不实际发送信号。这常被用来确定一个进程是否存在。
向一个不存在的进程发送信号,会返回-1,且errno为ESRCH。
7)int pause (void);
#include <unistd.h>
使调用进程进入睡眠状态,直到有信号终止该进程或被捕获。
只有调用了信号处理函数并从中返回以后,该函数才会返回。
该函数要么不返回(未捕获到信号),要么返回-1(被信号中断),errno为EINTR。
相当于没有时间限制的sleep函数。
8)int system (const char* command);
#include <stdlib.h>
1、标准C函数。执行command,成功返回command对应进程的终止状态,失败返回-1。
2、若command取NULL,返回非零表示shell可用,返回0表示shell不可用。
3、该函数的实现,调用了fork、exec和waitpid等函数,其返回值:
- 1) 如果调用fork或waitpid函数出错,则返回-1。
- 2) 如果调用exec函数出错,则在子进程中执行exit(127)。
- 3) 如果都成功,则返回command对应进程的终止状态(由waitpid的status输出参数获得)。
4、使用system函数而不用fork+exec的好处是,system函数针对各种错误和信号都做了必要的处理。
9)unsigned int alarm (unsigned int seconds);
#include <unistd.h>
1. 使内核在seconds秒之后,向调用进程发送SIGALRM(14)闹钟信号。
2、SIGALRM信号的默认处理是终止进程。
3、若之前已设过定时且尚未超时,则调用该函数会重新设置定时,并返回之前定时的剩余时间。
4、seconds取0表示取消之前设过且尚未超时的定时。