1.标准IO函数时候讲解的时钟代码,要求输入quit字符串后,结束进程
#include "/home/ubuntu/li/IO/head.h"
time_t lastsub(FILE *fp);
void *timeloop(void *arg)
{
FILE *fp = fopen("./homework","a+");
if(NULL == fp)
{
perror("fopen");
return NULL;
}
time_t eversub = lastsub(fp);//上次的序号
time_t t;
time_t low = time(&t);//起始时间
struct tm *res = NULL;
while(1)
{
time_t high = time(&t);//当前时间 :序号=当前时间-起始时间+上次的序号+1
res = localtime(&t);
fprintf(fp,"[%ld] %04d年%02d月%02d日%02d时%02d分%02d秒\n",high-low+1+eversub,\
res->tm_year+1900,res->tm_mon+1,res->tm_mday,\
res->tm_hour,res->tm_min,res->tm_sec);
printf("[%ld] %04d年%02d月%02d日%02d时%02d分%02d秒\n",high-low+1+eversub,\
res->tm_year+1900,res->tm_mon+1,res->tm_mday,\
res->tm_hour,res->tm_min,res->tm_sec);
fflush(fp);
sleep(1);
}
fclose(fp);
}
int main(int argc, const char *argv[])
{
pthread_t tid;
if(pthread_create(&tid,NULL,timeloop,NULL)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
char str[20];
scanf("%s",str);
while(strcmp(str,"quit")!=0)
{
scanf("%s",str);
}
return 0;
}
//每次输入都以\n结尾,不需要考虑额外情况
time_t lastsub(FILE *fp)
{
time_t res = 0;
char c;
while(1)
{
c=fgetc(fp);
if(EOF == c)
{
break;
}
else if('\n'==c)
res++;
}
return res;
}
要求定义一个全局变量 char buf[] = “1234567”,创建两个线程,不考虑退出条件。
1.线程循环打印buf字符串
2.线程循环倒置buf字符串,即buf中本来存储1234567,倒置后buf中存储7654321. 不打印!!
3.倒置不允许使用辅助数组。
4.要求A线程打印出来的结果只能为 1234567 或者 7654321
5.不允许使用sleep函数
#include "/home/ubuntu/li/IO/head.h"
char buff[] = "1234567";
void *rec(void *arg)
{
char temp;
char *p = buff;
char *q = buff+strlen(buff)-1;
while(p<q)
{
temp = *p;
*p = *q;
*q = temp;
p++;q--;
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, const char *argv[])
{
while(1)
{
pthread_t tid;//循环创建分支线程
if(pthread_create(&tid,NULL,rec,NULL)!=0)
{
fprintf(stderr,"pthread_create failed");
return -1;
}
printf("%s\n",buff);
pthread_join(tid,NULL);//阻塞等待分支线程结束
}
return 0;
}
要求用两个线程拷贝一张图片。A线程拷贝前半部分,B线程拷贝后半部分,不允许使用sleep函数
#include "/home/ubuntu/li/IO/head.h"
int fd = 0;
int fp = 0;
off_t rear;
off_t mid;
ssize_t res;
void *fun(void *arg)
{
char temp;
rear = lseek(fd,0,SEEK_END);
mid = rear/2;
lseek(fd,0,SEEK_SET);
while(1)
{
if(mid == lseek(fd,0,SEEK_CUR))
{
printf("前半部分读取结束\n");
break;
}
res = read(fd,&temp,1);
if(write(fp,&temp,1)<0)
{
ERR_MSG("write");
return NULL;
}
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, const char *argv[])
{
fd = open("./文件大小和行数.png",O_RDONLY);
fp = open("./cpypicture.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd<0||fp<0)
{
ERR_MSG("fdopen");
return -1;
}
pthread_t tid;
if(pthread_create(&tid,NULL,fun,NULL)!=0)
{
fprintf(stderr,"pthread_create failed");
return -1;
}
pthread_join(tid,NULL);
char temp;
while(1)
{
if(rear == lseek(fd,0,SEEK_CUR))
{
printf("后半部分文件读取完毕\n");
break;
}
res = read(fd,&temp,1);
if(write(fp,&temp,1)<0)
{
ERR_MSG("write");
return -1;
}
}
close(fd);
close(fp);
return 0;
}
//head.h
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <errno.h>
#include <sys/wait.h>
#include <pthread.h>
#define ERR_MSG(msg) do{\
fprintf(stderr,"line:%d\n",__LINE__);\
perror(msg);\
}while(0)