有名管道相互的信息交流
- 先读后写
#include <sys/types.h>
#include <sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#define FIFO_PATHNAME "myFifo"
int main()//必须写的那个和读的程序一起运行
{
int ret = -1;
ret = mkfifo(FIFO_PATHNAME,0777);//有名管道
if(-1==ret)
{
if(EEXIST !=errno)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
}
printf("fifo is ok\n");
int fd = -1;
fd = open(FIFO_PATHNAME,O_RDWR);
char caBuf[64]={'\0'};
int select = 1;
while(1)
{
//memset(caBuf, '\0', sizeof(caBuf));
sleep(1);
if(select == 0)//先读后写
{
if(fd == -1)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
char caBuf[64]={'\0'};
ret = read(fd,caBuf,sizeof(caBuf));
if(ret>0)
{
printf("%s\n",caBuf);
printf("read %d bytes to fifo\n",ret);
}
select = 1;
}
///////////////////////////////
else if(select == 1)
{
if(fd == -1)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
printf("请输入要说的话:\n");
scanf("%s",caBuf);
ret = write(fd,caBuf,sizeof(caBuf));
if(ret>0)
{
printf("write %d bytes to fifo\n",ret);
}
select = 0;
}
}
close(fd);
return 0;]
}
先写后读
#include <sys/types.h>
#include <sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#define FIFO_PATHNAME "myFifo"
int main()
{
int ret = -1;
ret = mkfifo(FIFO_PATHNAME,0777);
if(-1==ret)
{
if(EEXIST !=errno)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
}
printf("fifo is ok\n");
int fd = -1;
fd = open(FIFO_PATHNAME,O_RDWR);
char caBuf[64]={'\0'};
//////////////////////////
int select=1;
while(1)
{
//memset(caBuf, '\0', sizeof(caBuf));
sleep(1);
if(select==0)//先写后读
{
if(fd == -1)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
printf("请输入一段话\n");
scanf("%s",caBuf);
ret = write(fd,caBuf,strlen(caBuf));
if(ret>0)
{
printf("write %d bytes to fifo\n",ret);
}
select =1;
}
/////////////////////////////////////////
else if(select == 1)
{
ret = read(fd,caBuf,sizeof(caBuf));
if(ret>0)
{
printf("%s\n",caBuf);
printf("read %d bytes to fifo\n",ret);
}
select =0;
}
}
close(fd);
return 0;
}
共享内存
- gcc shmget.c -o m
- sudo ipce -m:编译完成后输入这个可以看到相关信息
写入
int main()
{
int shmid = -1;
shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
if(-1 == shmid)
{
perror("shmget");
exit(EXIT_FAILURE);
}
printf("shmget ok:id=%d\n",shmid);
void *pRet = NULL;
pRet = shmat(shmid,NULL,0);//建立链接
if((void *)-1==pRet)
{
perror("shmat");
exit(EXIT_FAILURE);
}
char *pData ="I want to sleep:\n";
memcpy(pRet,pData,strlen(pData));//其作用是往内存空间写入pData
shmdt(pRet);//斩断链接
return 0;
}
读取
int main()
{
int shmid = -1;
shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
if(-1 == shmid)
{
perror("shmget");
exit(EXIT_FAILURE);
}
printf("shmget ok:id=%d\n",shmid);
void *pRet = NULL;
pRet = shmat(shmid,NULL,SHM_RDONLY);//建立链接
if((void *)-1==pRet)
{
perror("shmat");
exit(EXIT_FAILURE);
}
char caBuf[32]={'\0'};
memset(caBuf,0,sizeof(caBuf));
memcpy(caBuf,pRet,sizeof(caBuf));
printf("%s\n",caBuf);
struct shmid_ds shmInfo;
shmctl(shmid,IPC_STAT,&shmInfo);
printf("shm size =%ld\n",shmInfo.shm_segsz);
shmdt(pRet);//斩断链接
shmctl(shmid,IPC_RMID,NULL);//删除id
return 0;
}
mmap映射
写入
int main()
{
int fd = -1;
fd = open("./test",O_RDWR);
if(-1 == fd)
{
perror("open");
exit(-1);
}
void *pRet = NULL;
pRet = mmap(NULL,32, PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
//初始化一个映射
if((void *)-1 == pRet)
{
perror("mmap");
exit(-1);
}
sprintf((char*)pRet,"%s %d %f","laoshaotongchi",1024,3.14);
//把内容输入到pRet里面去,
munmap(pRet,32);//取消映射
return 0;
}
读出来
int main()
{
int shmid = -1;
shmid = shmget(0x1204,1024,IPC_CREAT|S_IRUSR|S_IWUSR);
if(-1 == shmid)
{
perror("shmget");
exit(EXIT_FAILURE);
}
printf("shmget ok:id=%d\n",shmid);
void *pRet = NULL;
pRet = shmat(shmid,NULL,SHM_RDONLY);//建立链接
if((void *)-1==pRet)
{
perror("shmat");
exit(EXIT_FAILURE);
}
char caBuf[32]={'\0'};
memset(caBuf,0,sizeof(caBuf));
memcpy(caBuf,pRet,sizeof(caBuf));
printf("%s\n",caBuf);
struct shmid_ds shmInfo;
shmctl(shmid,IPC_STAT,&shmInfo);
printf("shm size =%ld\n",shmInfo.shm_segsz);
shmdt(pRet);//斩断链接
shmctl(shmid,IPC_RMID,NULL);//删除id
return 0;
}
信号---------------------------------------
信号alarm自杀函数
int main()
{
alarm(5);//五秒之后程序结束
while(1)
{
printf("hhhhh\n");
sleep(1);
}
return 0;
}
signal:信号
int main()
{
pid_t pid=1;
pid =fork();
if(pid >0)
{
while(1)
{
printf("i am father process,waitting child to kill me\n");
sleep(1);
}
}
else if(pid==0)
{
int i=5;
while(1)
{
if(0==i)
{
printf("i kill father:\n");
kill(getppid(),SIGKILL);
break;
}
else
{
printf("still has %d second to kill parent\n",i);
sleep(1);
}
i--;
}
}
else if(-1==pid)
{
perror("fork");
exit(-1);
}
return 0;
}
信号raise:感觉和alarm有点像
int main()
{
int i = 5;
while(1)
{
if(0==i)
{
raise(SIGKILL);
}
printf("lllll\n");
sleep(1);
i--;
}
return 0;
}
网友评论