作业-11.11
创始人
2024-04-06 18:26:31

1、要求创建两个线程,以及一个全局变量,char str[] = "123456";要求如下:

        (1)一个线程专门用于打印str;

        (2)另外一个线程专门用于倒置str字符串,不使用辅助数组。

        (3)要求打印出来的结果必须是123456或者654321,不能出现乱序情况,

                例如623451 653421

#include
#include
#include
#include

//int *p = NULL;

char *tmp = NULL;

void* call_back(void *arg)
{
    int *p = (int *)arg;
    while(1)
    {
        while(1)
        {

            if(NULL == tmp)
            {
                sleep(1);
            }else
            {
                int len = strlen(tmp);
                int i=0,j=len-1;
                while(i                 {
                    if(tmp[i] != tmp[j])
                    {
                        tmp[i] ^= tmp[j];
                        tmp[j] ^= tmp[i];
                        tmp[i] ^= tmp[j];
                    }
                    i++;
                    j--;
                }
                printf("%s\n", tmp);
                *p = 1;
            }
            if(*p)
            {
                break;
            }
        }
        *p = 0;
        sleep(1);
    }
}

int main(int argc, const char *argv[])
{
    //创建一个线程
    pthread_t tid;

    int flag = 0;
    if(pthread_create(&tid, NULL, call_back, (void *)&flag) != 0)
    {
        perror("pthread_create");
        return -1;
    }
    printf("线程创建成功\n");

    char arr_char[7] = "123456";
    tmp = arr_char;
    int i = 0;
    while(1)
    {
        while(tmp[i])
        {
            printf("%c", tmp[i++]);
        }
        putchar(10);
        while(1)
        {
            if(flag)
            {
                break;
            }
        }
    }

    return 0;
}

 

2、要求用线程拷贝一张图片,一个线程拷贝前半部分,另一个线程拷贝后半部分

#include
#include
#include
#include
#include
#include
#include

int count = 0;
int flag = 0;
int fd = 0;
int fd_w = 0;

void* call_back(void *arg)
{
    ssize_t res = 0;
    ssize_t res_w = 0;

    char arr[128] = "0";
    int len = sizeof(arr);

    while(1)
    {
        if(flag != 1)
        {
            sleep(1);
        }else if(1 == flag)
        {
            printf("coun = %d.\n", count);
            lseek(fd, count*len, SEEK_SET);
            lseek(fd_w, count*len, SEEK_SET);
            while(1)
            {
                bzero(arr, sizeof(arr));
                res = read(fd, arr , len);
                if(!res)
                {
                    flag = 2;
                    break;
                }
                else if(res < 0)
                {
                    fprintf(stderr, "__%d__\n", __LINE__);
                    perror("read");

                    return NULL;
                }
                res_w = write(fd_w, arr, res);
                if(res_w < 0)
                {
                    perror("write");
                    return NULL;
                }
            }

            close(fd);
            close(fd_w);
            putchar(10);

        }
    }


}

int main(int argc, const char *argv[])
{
    if(argc < 3)
    {
        fprintf(stderr, "请从命令行输入图片名和复制后的文件名\n");
        return -1;
    }
    if(!strcmp(argv[1], argv[2]))
    {
        fprintf(stderr, "复制后的文件名和原文件名不能相同!!!\n");
        return -1;
    }

    //打开文件
    fd = open(argv[1], O_RDONLY);
    fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0777);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    if(fd_w < 0)
    {
        perror("open");
        return -1;
    }

    ssize_t res = 0;
    ssize_t res_w = 0;

    char arr[128] = "0";
    int len = sizeof(arr);


    count = (lseek(fd, 0, SEEK_END)/len);
    count++;
    printf("count = %d.\n", count);


    //创建一个线程
    pthread_t tid;
    if(pthread_create(&tid, NULL, call_back, NULL) != 0)
    {
        perror("pthread_create");
        return -1;
    }
    printf("线程创建成功\n");

    if(0 == flag)
    {
        printf("主进程前半\n");
        int tmp = count;

        //将指针偏移到文件开头
        lseek(fd ,  0, SEEK_SET);
        lseek(fd_w, 0, SEEK_SET);

        while(1)
        {
            bzero(arr, sizeof(arr));
            res = read(fd, arr , len);

            if(res < 0)
            {
                fprintf(stderr, "__%d__\n", __LINE__);
                perror("read");

                return -1;
            }

            //写入数据
            res_w = write(fd_w, arr, res);
            if(res_w < 0)
            {
                perror("write");
                return -1;
            }

            //所需要的拷贝次数--
            count--;

            //如果拷贝的数据比总数据的一半就退出循环
            if(count < (tmp/2))
            {
                flag = 1;
                break;
            }
        }
    }
    while(1)
    {
        sleep(1);
        if(2 == flag)
        {
            break;
        }
    }

    return 0;
}

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...