1.信号
#include <head.h>
//定义自定义信号处理函数
void handler(int signo)
{
if(signo == SIGINT)
{
printf("按下ctrl + c键\n");
}
return;
}
int main(int argc,const char *argv[])
{
if(signal(SIGINT, handler) == SIG_ERR)
{
perror("error\n");
return -1;
}
while (1)
{
sleep(1);
printf("hello\n");
}
return 0;
}
2.管道(以无名管道为例子)
#include "head.h"
int main(int argc, const char *argv[])
{
int pid=-1;
int fd[2]={0};
char buf[128]={0};
if(pipe(fd) == -1){//建立管道
printf("creat pipe error\n");
}
pid = fork();//创建进程
if(pid >0){//父进程
printf("我是你爹\n");
close(fd[0]);//父进程关闭读端
write(fd[1],"father",strlen("father"));//父进程向管道内写入内容
}else if(pid == 0){//子进程
printf("我是儿子\n");
close(fd[1]);//子进程关闭写端
read(fd[0],buf,128);//从管道内读出数据
printf("收到父进程消息%s\n",buf);
}
return 0;
}
3.共享内存
写:
#include "head.h"
int main(int argc, const char *argv[])
{
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error\n");
return -1;
}
//通过key值创建共享内存段
int shmid = shmget(key, 4096, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
//将共享内存段映射到用户空间
char *addr = (char *)shmat(shmid, NULL, 0);
if(addr == (void*)-1 )
{
perror("shmat error");
return -1;
}
printf("addr = %p\n", addr);//输出映射的虚拟地址
//4、使用共享内存段
while(1)
{
printf("请输入>>>>");
fgets(addr, 4096, stdin);//向共享内存中输入数据
addr[strlen(addr)-1] = 0;
if(strcmp(addr, "quit") == 0)//写入quit时退出
{
break;
}
}
//取消addr对共享内存的映射关系
if(shmdt(addr) == -1)
{
perror("shmdt error\n");
return -1;
}
return 0;
}
读:
#include "head.h"
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error\n");
return -1;
}
//通过key值创建共享内存段
int shmid = shmget(key, 4096, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error\n");
return -1;
}
//将共享内存段映射到用户空间
char *addr = (char *)shmat(shmid, NULL, 0);
if(addr == (void*)-1 )
{
perror("shmat error\n");
return -1;
}
//使用共享内存段
while(1)
{
//读取共享内存中的数据
printf("共享内存中的数据为: %s\n", addr);
if(strcmp(addr, "quit") == 0)
{
break;
}
}
//取消映射
if(shmdt(addr) == -1)
{
perror("shmdt error");
return -1;
}
//删除共享内存
if(shmctl(shmid, IPC_RMID, NULL) == -1)
{
perror("shmctl error");
return -1;
}
return 0;
}