#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<pthread.h>
pthread_t tid1;//全局变量线程编号
pthread_t tid2;
//读线程
void *read_thread(void *arg)
{
int n = 0;
int fd = *(int *)arg;
char buf[128] = {0};//接受键盘输入的字符串
// buf = (char *)arg;
while(1){
//sleep(3);
memset(buf,0,sizeof(buf));
n = read(fd,buf,sizeof(buf));
if(0 == n){
continue;
}
printf("文件内容是:%s\n",buf);
}
}
//线程,写入文件
void *write_thread(void *arg)
{
int n = 0;
int fd = *(int *)arg;
char buf[128] = {0};//接受键盘输入的字符串
// buf = (char *)arg;
while(1){
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
n = write(fd,buf,sizeof(buf));
if(0 == n){
continue;
}
//printf("read:%s\n",buf);
lseek(fd,-n,SEEK_CUR);
if(!strncmp(buf,"quit",4)){
pthread_cancel(tid1);
pthread_exit(NULL);
}
//write(fd,buf,sizeof(buf));
}
}
int main(int argc, const char *argv[])
{
int fd;//标注文件描述符
int ret1 = 0;//子进程创建成功标志
//int ret2 = 0;
char *retval = NULL;
fd = open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0666);
if(fd < 0){
perror("fail to open");
return -1;
}
//创建两个线程
ret1 = pthread_create(&tid1,NULL,read_thread,(void *)&fd);
if(ret1 != 0){
errno = ret1;
perror("fail to open pthread");
return -1;
}
// pthread_detach(tid1);
ret1 = pthread_create(&tid2,NULL,write_thread,(void *)&fd);
if(ret1 != 0){
errno = ret1;
perror("fail to open pthread");
return -1;
}
// pthread_detach(tid2);
//写线程
// write_thread(void *arg);
//读线程
// read_thread(viod *);
//等待子线程退出
pthread_join(tid1,(void**)&retval);
pthread_join(tid2,(void**)&retval);
close(fd);
return 0;
}