标准lO函数时候讲解的时钟代码,要求输入quit字符串后,结束进程
#include "head.h"
void *callBack(void *arg)
{
char str[32]="";
while(1)
{
scanf("%s",str);
if(strcmp(str,"quit")==0)
{
exit(1);
}
}
}
int main(int argc, const char *argv[])
{
pthread_t tid;
if(pthread_create(&tid,NULL,callBack,NULL)!=0)
{
printf("错误\n");
return -1;
}
if(argc<2)
{
printf("请输入文件名\n");
return -1;
}
FILE *ps=fopen(argv[1],"w+");
if(NULL==ps)
{
perror("fopen");
return -1;
}
// printf("%ld\n",Time);
int count=0;
char str[32]="";
int sub;
while(1)
{
if(NULL==fgets(str,sizeof(str),ps))
{
break;
}
if(str[strlen(str)]=='\0')
{
count++;
}
}
sub=count;
while(1)
{ ;
time_t Time=time(&Time);
struct tm *seqlist;
seqlist = localtime(&Time);
fprintf(ps,"[%d] %d-%d-%d %d-%2.d-%d\n",sub++,seqlist->tm_year+1900,\
seqlist->tm_mon+1,seqlist->tm_mday,\
seqlist->tm_hour,seqlist->tm_min,seqlist->tm_sec);
fflush(ps);
sleep(1);
}
fclose(ps);
return 0;
}
2.要求定义一个全局变量char buf="1234567",创建两个线程,不考虑退出条件。
a.A线程循环打印buf字符串,
b.B线程循环倒置buf字符串,即buf种本来存储1234567,倒置后buf仲存储7654321.不打印!!
c.倒置不允许使用辅助数组。
d.要求A线程打印出来的结果只能为1234567或者7654321
e.不允许使用sleep函数
#include "head.h"
char buf[]="1234567";
void *Callback(void *arg)//B线程倒置
{
char *pa=buf;
int num=sizeof(buf)-1;
for(int i=0;i<num/2;i++)
{
char temp=buf[i];
buf[i]=buf[num-1-i];
buf[num-1-i]=temp;
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
while(1)
{
pthread_t tid;
if(0!=pthread_create(&tid,NULL,Callback,NULL))//循环创建一个B线程
{
fprintf(stderr,"%d错误\n",__LINE__);
return -1;
}
if(pthread_detach(tid)==0)
{
fprintf(stdout,"%s\n",buf);
}
}
return 0;
}
3.要求用两个线程拷贝一张图片。A线程拷贝前半部分,B线程拷贝后半部分,不允许使用sleep函数
#include "head.h"
void *callback(void *age)//分支进程打印前半部分文件
{
//打开文件
int pid=open("1.png",O_RDONLY);
if(pid<0)
{
ERR_MSG("open_pid");
return NULL;
}
int gid=open("2.png",O_RDWR|O_APPEND|O_CREAT,0664);
if(gid<0)
{
ERR_MSG("open_gid");
return NULL;
}
//复制图片
struct stat buf;
stat("1.png",&buf);
off_t sub=buf.st_size/2;
if(buf.st_size%2!=0)
{
sub=sub+1;
}
for(int i=0;i<sub;i++)
{
char A01;
read(pid,&A01,1);
write(gid,&A01,1);
}
pthread_exit(NULL);
//释放空间
if(close(pid)<0)
{
ERR_MSG("close_pid");
return NULL;
}
if(close(gid)<0)
{
ERR_MSG("gid");
return NULL;
}
}
int main(int argc, const char *argv[])//主进程
{
pthread_t tid;//先创建子进程
if(pthread_create(&tid,NULL,callback,NULL)!=0)//主进程打印图片后半部分
{
fprintf(stderr,"%d错误\n",__LINE__);
return -1;
}
if(pthread_join(tid,NULL)==0)//当分支进程打印完毕进程销毁后父进程开始打印后半部分
{
int pid=open("1.png",O_RDONLY);
if(pid<0)
{
ERR_MSG("open_pid");
return -1;
}
int gid=open("2.png",O_RDWR|O_APPEND|O_CREAT,0664);
if(gid<0)
{
ERR_MSG("open_gid");
return -1;
}
//复制图片
struct stat buf;
stat("1.png",&buf);
off_t sub=buf.st_size/2;
lseek(pid,sub+1,SEEK_SET);
lseek(gid,sub+1,SEEK_SET);//答应后半部分图片文件偏移量先移动到中间
for(int i=0;i<sub;i++)
{
char A01;
read(pid,&A01,1);
write(gid,&A01,1);
}
// pthread_exit(NULL);
//释放空间
if(close(pid)<0)
{
ERR_MSG("close_pid");
return -1;
}
if(close(gid)<0)
{
ERR_MSG("gid");
return -1;
}
}
return 0;
}