作业-11.11

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

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

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

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

                例如623451 653421

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

//int *p = NULL;

char *tmp = NULL;

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

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

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;

    while(1)
    {
        if(0 == flag)
        {
            printf("----------顺序打印---------\n");
            printf("%s\n", tmp);
            flag = 1;
        }
    }

    return 0;
}

 

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

#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值