作业-11.11
创始人
2024-04-06 17:49:11

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;
}

 

相关内容

热门资讯

原创 张... 文/张家豪律师 重庆智豪律师事务所高级合伙人 案情简介:违法所得高达40万元的开设赌场罪,原本刑期...
确认延时运营!福州地铁发布 福州地铁22日最新发布!春节假期临近尾声,返程高峰即将到来,为保障市民乘客便捷、顺畅出行,福州地铁延...
越南北部船只倾覆事故致6人死亡 本文转自【新华网】;新华社河内2月22日电(记者邹学冕)据越南通讯社22日报道,越南北部老街省前一天...
武吉在《封神演义》中最后死了吗... 阐教有许多三代弟子,这些三地弟子之中,有许多人都死后封神,比如殷郊、殷洪、土行孙、杨任、黄天化等等。...
姜子牙的众多弟子中混的最好的是... 姜子牙我们非常的熟悉,他有两个徒弟,但是其中一个徒弟在经历了千百年之后才当上了神 ,所以今天小编就带...