《Linux环境下C编程V2》杨树青
1. gcc
-pipe有何用?
-Wall:提供N多警告信息
2. gdb
Q:core dump的分析,似乎比较有用
3. 进程组
leader进程:进程组号=进程号
setgpid(pid_t pid, pid_t pgid); // 当两号相等时即创建新进程组
4. 共享内存
int shmget(key_t key, int size, int flag);
若key为IPC_PRIVATE,建一个大小为size的新共享内存,flag无效
若key不为IPC_PRIVATE,IPC_CREAT在flag中置位,IPC_EXCL不置位,则操作由key值决定
若key为已经打开的一个shm键,则打开
否则创建新shm
若key不为IPC_PRIVATE,IPC_CREAT在flag中置位,IPC_EXCL也置位,则执行创建动作
若key值的shm已经存在,则失败
Q:IPC_EXCEL是神马东东?
5. 信号量
Q:信号量集,操作有点复杂呢?
Q:两个单独的进程如何取得同一个信号量的id的?约定吗?
6. 管道
半双工,同源进程,稍慢(比共享内存)
两个独立的fd
只存在于内核中
7. 命名管道FIFO
特殊文件存在于文件系统中
8. 消息队列
与pipe相比,最重要的区别是有消息类型概念
9. 文件流访问
缓冲区是区别于系统调用访问文件系统最大的区别
格式化I/O是另一大区别
10. 信号signal
针对进程process的异步事件通知机制,其实是软中断
不能传递大量信息,只通知事件发生
signal(sig_id, sig_handler)注册signal处理程序
SIGKILL与SIGSTOP无法被捕获及忽略
例:
[root@localhost ch10]# cat test10.1.sigterm.c
#include <stdio.h>
#include <signal.h>
#include <stdarg.h>
void terminatorHandler(int signumber);
int main() {
char buffer1[100], buffer2[100];
int i;
if(signal(SIGTERM, terminatorHandler)==SIG_ERR) {
perror("signal");
}
printf("PID: %d/n", getpid());
for(;;) {
fgets(buffer1, sizeof(buffer1), stdin);
printf("input: %s/r/n", buffer1);
}
return 0;
}
void terminatorHandler(int signumber) {
printf("SYSTERM signal caught. /n");
exit(0);
}
* sigaction
有一些Linux下的高级signal处理特性,如信号集,阻塞,以后研究!
* 潜在风险
尤其于时间相关的操作时,如pause(), SIGALARM,在系统繁忙时可能会有预期外的结果出现!
11. 套接字通讯
Q:面向连接的设计要求对每个连接都有一个单独的socket,而无连接的设计则允许从一个socket上与多个主机通信?
T:socket读写的时候,通常可能会比要求的size少,需要机制重复read/write。
T:bind()是可选的,尤其是对client端,只有当需要使用特定端口(如服务器)时,必须使用bind()。