补充:
html
apache(web)
C语言写网站后台程序,称作CGI
今天:
一、 未决信号
定义:从信号的产生到信号的到达,在这期间叫做未决信号
sigpending(2)
#include <signal.h>
int sigpending(sigset_t *set);
功能:检查未决信号,将信号集里的未决信号的相应位置1
参数:
set:信号集 (值_结果参数)
返回值:
成功返回0,失败返回1
举例:vi pending.c
1 #include<stdio.h>
2 #include<signal.h>
3 int main(){
4 sigset_t set;
5 sigset_t pset;
6 //清空set
7 sigemptyset(&pset);
8 sigemptyset(&set);
9 //将信号添加到集合set里
10 sigaddset(&set,SIGINT);
11 //设置信号的屏蔽
12 sigprocmask(SIG_SETMASK,&set,NULL);
13 sleep(10);
14 //获取未决信号
15 sigpending(&pset);
16 //判断SIGINT是不是未决信号
17 if(sigismember(&pset,SIGINT)==1){//一次检测一个,这次检测SIGINT,若要检测其他信号,再写if语句
18 printf("SIGINTpending...\n");
19 }
20 return 0;
21 }
tarena@tarena-virtual-machine:~/day31$./a.out
^CSIGINT pending...
作用:在休眠10s内输入ctrl+c,没有反应(阻塞),最后判断SIGINT是不是未决信号
(输入ctrl+c产生了信号,但是被sigprocmask设置屏蔽,此时的信号就是未决信号)
改变:
1#include<stdio.h>
2#include<signal.h>
3int main(){
4 sigset_t set;
5 sigset_t pset;
6 //清空set
7 sigemptyset(&pset);
8 sigemptyset(&set);
9 //将信号添加到集合set里
10 sigaddset(&set,SIGINT);
11 //设置信号的屏蔽
12// sigprocmask(SIG_SETMASK,&set,NULL);
13 sleep(10);
14 //获取未决信号
15 sigpending(&pset);
16 //判断SIGINT是不是未决信号
17 if(sigismember(&pset,SIGINT)==1){
18 printf("SIGINT pending...\n");
19 }
20 return 0;
21 }
tarena@tarena-virtual-machine:~/day31$./a.out
^C
作用:12 // sigprocmask(SIG_SETMASK,&set,NULL);
没有屏蔽ctrl+c的命令,即在睡眠期间,可以接受信号,按下ctrl+c就可以执行打断功能,就不存在未决信号。
二、 有名管道
创建一个管道文件,一个进程往这个文件里写数据,一个进程从这个文件里读取数据,就此完成了两个进程间的通讯。
文件比较特殊,这个文件只是作为进程间通讯使用,文件的大小为0
管道的创建:
mkfifo(3)
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char*pathname, mode_t mode);
功能:创建一个管道文件
参数:
pathname:文件的路径
mode:文件具有的权限,需要考虑umask
返回值:0成功,-1失败,errno被设置
举例:processA.c 先执行,在这个进程中创建管道,往管道里写内容
processB.c 后执行,从管道里读