IO进程线程复习
文件IO和标准IO的区别
文件IO:
1.系统提供的用于输入输出的函数
2.有文件描述符0,1,2
3.open,close,puts,gets
4.可以操作任意类型的文件,不能操作目录
5.无缓存机制
标准IO:
1.C库提供的用于输入输出的函数
2.有文件流,stdin,stdout,stderr
3.fopen,fclose,fputs,fgets
4.只能操作普通文件和其他部分类型文件
5.有缓存机制
进程有哪五态
创建态 就绪态 运行态 消亡态 阻塞态
什么时候刷新缓存区
换行、缓冲区溢出、输入输出切换、缓冲区刷新函数fflush、程序结束、关闭标准输入流标准输出流指针
行缓存和全缓存的区别
全缓存换行不会刷新缓冲区
进程模板
int main()
{
pid_t pid=fork();
if(pid>0)//父进程
{
}
else if(pid==0)//子进程
{
}
else
{
perror("fork");
}
return 0;
}
如何实现同步
无名信号、互斥锁+条件变量
如何实现异步通讯
管道,消息队列,共享内存,信号灯集,套接字,信号
消费者模型(参考写法不唯一)
pthread_mutex_t mt1;
pthread_cond_t cond1;
int n=0;
void* producer(void* arg)
{
for(int i=0;i<5;i++)
{
pthread_mutex_lock(&mt1);
printf("生产了一台特斯拉%d\n",n);
n++;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&mt1);
sleep(5);
}
}
void* consumer(void* arg)
{
pthread_mutex_lock(&mt1);
pthread_cond_wait(&cond1,&mt1);
printf("购买了一台特斯拉\n");
sleep(10);
pthread_mutex_unlock(&mt1);
}
int main()
{
pthread_mutex_init(&mt1,NULL);
pthread_cond_init(&cond1,NULL);
pthread_t ti;
pthread_t tid[5];
ti=pthread_create(&ti,NULL,producer,NULL);
if(ti!=0)
{
perror("pthread_create");
return -1;
}
for(int i=0;i<5;i++)
{
tid[i]=pthread_create(&tid[i],NULL,consumer,NULL);
if(tid[i]!=0)
{
perror("pthread_create");
return -1;
}
}
pthread_join(ti,NULL);
for(int i=0;i<5;i++)
{
pthread_join(tid[i],NULL);
}
pthread_mutex_destroy(&mt1);
pthread_cond_destroy(&cond1);
return 0;
}
消息队列
//发送
typedef struct
{
long type;
char text[248];
}msg;
int main(argc,argv[])
{
if(argc!=2)
{
return -1;
}
int type=atoi(argv[1]);
key_t key=ftok("./ipc",1);
int id=msgget(id,IPC_CREAT|0666);
while(1)
{
msg buff={0};
scanf("%247s",&buff.text);
while(getchar()!=10);
msgsnd(id,&buff,strlen(buff.text),0);
}
return 0;
}
//接收
typedef struct
{
long type;
char text[248];
}msg;
int main(argc,argv[])
{
key_t key=ftok("./ipc",1);
int id=msgget(id,IPC_CREAT|0666);
while(1)
{
msg buff={0};
int type=-1;
scanf("%d",&type);
while(getchar()!=10);
buff.type=type;
msgrcv(id,&buff,248,type,IPC_NOWAIT|020000);
}
return 0;
}
共享内存
//输出
typedef struct
{
char text[256];
}shm;
shm* addr=NULL;
int id=-1;
void handler(int sign)
{
shmdt(addr);
shmctl(id,IPC_RMID,NULL);
exit(0);
}
int main()
{
signal(SIGINT,handler);
key_t key=ftok("./ipc",1);
id=shmget(key,sizeof(shm),IPC_CREAT|0666);
addr=shmat(id,NULL,0);
while(1)
{
printf("%s\n",addr->text);
memset(addr,0,sizeof(addr));
sleep(1);
}
return 0;
}
//写入
typedef struct
{
char text[256];
}shm;
shm* addr=NULL;
int id=-1;
void handler(int sign)
{
shmdt(addr);
shmctl(id,IPC_RMID,NULL);
exit(0);
}
int main()
{
signal(SIGINT,handler);//ctr+c 暂停
key_t key=ftok("./ipc",1);
id=shmget(key,sizeof(shm),IPC_CREAT|0666);
addr=shmat(id,NULL,0);
while(1)
{
scanf("%255s",addr->text);
while(getchar()!=10);
sleep(1);
}
return 0;
}