![](https://i-blog.csdnimg.cn/blog_migrate/baca49b8a8be712497ca48c621ef92cc.png)
#include<pthread.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
/*
* function: 循环输入输出 子线程
* @param [ in] 无
* @param [out]
* @return 子线程结束运行返回对应退出码
*/
void *pthread_exec(void *arg)
{
static int q = 0x78;//退出码
char *ch = NULL;//输入返回值
char buf[1024] = {0};
while(1){
memset(buf,0,sizeof(buf));
ch = fgets(buf,sizeof(buf),stdin);
if(ch == NULL)
continue;
if(strncmp(buf,"quit",4) == 0)
pthread_exit(&q);
fputs(buf,stdout);
}
}
int main(int argc, const char *argv[])
{
pthread_t tid;//子线程码
int ret ;//子线程返回值
int *q ;
ret = pthread_create(&tid,NULL,pthread_exec,NULL);
pthread_join(tid,(void **)&q);
printf("exit:%#x\n",*q);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/4348f58b8cabf18837b2a0cc1b405256.png)
#include<pthread.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
pthread_t tid1;
pthread_t tid2;
//子线程,读
void *pthread_read(void *arg)
{
int ch;
char buf[1024] = {0};
int fd = *(int *)arg;
while(1){
memset(buf,0,sizeof(buf));
ch = read(fd,buf,sizeof(buf));
if(ch == 0)
continue;
fputs(buf,stdout);
}
}
//子线程,写
void *pthread_write(void *arg)
{
int n = 0;
char buf[1024] = {0};
int fd = *(int *)arg;
while(1){
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),stdin);
if(strncmp(buf,"quit",4) == 0)
{
pthread_cancel(tid1);
pthread_exit(NULL);
}
n = write(fd,buf,sizeof(buf));
lseek(fd,-n,SEEK_END);
}
}
int main(int argc, const char *argv[])
{
int fd;//文件标识符
int ret1,ret2;
//打开文件
fd = open(argv[1],O_RDWR|O_CREAT|O_TRUNC,666);
if(fd < 0)
{
perror("fail to open");
return -1;
}
//创建读线程
ret1 = pthread_create(&tid1,NULL,pthread_read, &fd);
if(ret1 != 0)
{
errno = ret1;
perror("fail to create tid1");
return -1;
}
//创建写线程
ret2 = pthread_create(&tid2,NULL,pthread_write,&fd);
if(ret2 != 0)
{
errno = ret2;
perror("fail to create tid2");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(fd);
return 0;
}