2023/2/28 Linux创建子线程,利用pthread的类函数实现以下操作

4 篇文章 0 订阅
4 篇文章 0 订阅
  1. 标准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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值