两个程序(没有任何关系)之间通信:
使用有名文件通信。管道文件可以解决文件偏移量的麻烦问题。
mkfifo(path,mode):
管道文件:
两种进程间通信的方式:无名管道和有名管道。
所有进程共享内核运行空间。
ftok(path,int项目id):给内核中的公共空间命名,参数path只要是系统所具有的路径就可以了,id可以随便给。
它返回的是:-1表示失败,
消息队列:
msgget();他需要ftok的返回值,返回-1表示失败。
(key,IPC_CREAT|0666):创建
(key,0):打开已有的
msgsnd():发送消息。
msgrcv():从消息队列中接受数据。
msgrv
msgctl()
发送数据的格式是有规定的:struct msgbuf{
long mtype;
char mtext[1];}
mtype是为内核缓冲区的标志,取的时候是根据该标志来取内容的。发消息的参数size_t是
该结构体的大小减去mtype的大小。
内核空间要释放:用宏IPC
shmget():创建共享内存;
shmad():访问内核地址空间。可以自己指定。
shmat(id,NULL,flag):NULL表示地址是内核指定的。flag可以是0;
该函数将映射地址返回。我们可以从该映射地址对内核空间进行访问。创建了一张映射表。
shmdt();取消地址映射
shmctl
IPC_RMID:删除内核中共享内存。
signal:异步通知。
ctrl+c:
kill -l:可以看到所有的信号。(64个)
kernel随时处理发送来的信号。
kill -num pid:可以给任何一个进程发送某个信号。
tcgetpgrp():
ctrl +z:SIGSTOP
ctrl +\:SIGQUIT
ctrl +s:SIG
SIGABRT:异常信号。
stty -a:编辑信号热键。
raise():
abort():
kill(pid,sig):
pid》0:
pid==0;给组进程发信号
pid==-1;给任何能接受到信号的进程发送信号
pid
sleep():
alarm():
signal():
SIG_KILL和SIG_STOP信号是不能忽略和修改(利用signal函数修改)的。
pause();用来阻塞等待任何一个信号。使用它必须保证阻塞等待的信号会到,否则造成程序的活死人。
setjmp():设置跳转点
longjmp():实现跳转。
信号处理实际上会屏蔽掉该信号本身。进入一个信号中会屏蔽掉该信号。
sigprocmask():信号屏蔽码。发送信号的动作是内核调用该信号处理函数。
信号只会缓冲一个。属于不可靠类型。
sigsetmask();
sigemptyset():清空信号屏蔽码
sigfillset():信号集全部置1;
sigaddset():添加信号。
sigdelset():删除。。。出信号。
sigismember():测试该信号集合中有无该信号。
sigsuspend():等待mask没有屏蔽的信号。
pause():等待任何一个信号。
sigpending():测试屏蔽过程