【1】信号
kill-l :显示系统中的信号。
kill -num PID:给pid进程发送num信号。
信号的概念:
1)信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
2)信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
3)如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
信号的响应方式:
1.忽略信号:对信号不做任何处理,(SIGKILL SIGSTOP)不能被忽略
2.捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数,(SIGKILL SIGSTOP)不能被捕捉.
3.进行缺省操作:Linux对每种信号都规定了默认操作。
信号的种类:
2)SIGINT:结束进程,对应快捷方式ctrl+c
3)SIGQUIT:退出信号,对应快捷方式ctrl+\
9)SIGKILL:结束进程,不能被忽略不能被捕捉
15)SIGTERM:结束终端进程,kill 使用时不加数字默认是此信号
17)SIGCHLD:子进程状态改变时给父进程发的信号
19)SIGSTOP:结束进程,不能被忽略不能被捕捉
20)SIGTSTP:暂停信号,对应快捷方式ctrl+z
26)SIGALRM:闹钟信号,alarm函数设置定时,当到设定的时间时,内核会向进程发送此信号结束进程。
函数接口:
alarm定时 pause挂起
printf("%d\n",alarm(5));
printf("hello world\n");
sleep(1);
printf("%d\n", alarm(3));
pause();
return 0;
kill (pid_t pid,int sig); 指定进程发送信号
raise(int sig);进程向自己发送信号
void handler(int sig)
{
if (sig==3)
{
printf("hello,world\n");
}
}
int main()
{
//忽略信号
// signal(SIGINT ,SIG_IGN) ;
//缺省操作
// signal(2,SIG_DFL);
//捕捉操作
signal(2,handler);
pause();
printf("*********************\n");
return 0;
}
【2】共享内存
1.特点:
1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝
2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间
3)进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。
4)由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等
2.操作步骤:
- 创建key值,ftok
- 创建或打开共享内存 shmget
- 映射共享内存到地址空间 shmat
- 撤销映射 shmdt
- 删除共享内存 shmctl
3.函数接口:
int main(int argc, char const *argv[])
{
key_t key = ftok("./1.c", 'a');
if (key < 0)
{
perror("ftok err");
return -1;
}
printf("key:%#x\n", key);
int shmid = shmget(key, 128, IPC_CREAT | IPC_EXCL | 0666);
if (shmid < 0)
{
if (errno == 17)
shmid = shmget(key, 128, 0666);
else
{
perror("shmget err");
return -1;
}
}
printf("shmid:%d\n", shmid);
printf("****************************************\n");
char *p = shmat(shmid, NULL, 0);
if (p==(void *)-1)
{
perror("errorrr");
}
fgets(p, 32, stdin);
fputs(p, stdout);
shmdt(p);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
命令:
ipcs -m: 查看系统中的共享内存
ipcrm -m shmid:删除共享内存