1.信号
include "myhead.h"
//定义信号处理函数
void handler(int signo)
{
if(signo == SIGINT)
{
printf("用户按下了ctrl + c键,hello world\n");
}
}
int main(int argc, const char *argv[])
{
if(signal(SIGINT, handler) == SIG_ERR)
{
perror("signal error");
return -1;
}
return 0;
}
2.无名管道
#include "myhead.h"
int main(int argc, const char *argv[])
{
int pid=0;
int fd[2]={0};
char buf[128]={0};
if(pipe(fd) == -1){//建立管道
printf("creat pipe failed\n");
}
if(pid=fork()<0){
perror("fork error\n");
}
else if(pid >0){//父进程
sleep(3);
printf("father\n");
close(fd[0]);//父进程关闭读端
write(fd[1],"father",strlen("father"));//父进程对管道内写入
}else{//子进程
printf("child\n");
close(fd[1]);//子进程关闭写端
read(fd[0],buf,128);//从管道内读出数据
printf("read:%s\n",buf);
}
return 0;
}
3.共享内存
读端
#include "myhead.h"
int main(int argc, const char *argv[])
{
//创建一个key值
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %#x\n", key);
//通过key值创建共享内存段
int shmid = shmget(key, 4096, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n", shmid);
//将共享内存段映射到用户空间
char *addr = (char *)shmat(shmid, NULL, 0);
if(addr == (void*)-1 )
{
perror("shmat error");
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;
}
写端
#include "myhead.h"
int main(int argc, const char *argv[])
{
key_t key = ftok("/", 't');
if(key == -1)
{
perror("ftok error");
return -1;
}
printf("key = %#x\n", key);
//通过key值创建共享内存段
int shmid = shmget(key, 4096, IPC_CREAT|0664);
if(shmid == -1)
{
perror("shmget error");
return -1;
}
printf("shmid = %d\n", shmid);
//将共享内存段映射到用户空间
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)
{
break;
}
}
//取消addr对共享内存的映射关系
if(shmdt(addr) == -1)
{
perror("shmdt error");
return -1;
}
return 0;
}