9.11作业

1.完成图片拷贝,要求主线程拷贝一半,分支线程拷贝另一半。
#include 

off_t size;

void* t(void* arg)
{
    // 打开文件
    int fd1, fd2;
    fd1 = open(*((char**)arg + 1), O_RDONLY);
    if (fd1 < 0)
        PRINT_ERR("open f1");
    fd2 = open(*((char**)arg + 2), O_WRONLY);
    if (fd2 < 0)
        PRINT_ERR("open f2");

    // 置位光标到文件的一半处
    lseek(fd1, size / 2, SEEK_SET);
    lseek(fd2, size / 2, SEEK_SET);

    // 开始拷贝
    char str[128];
    ssize_t res;
    while (1) {

        res = read(fd1, str, sizeof(str));
        if (res <= 0) {
            puts("子进程拷贝结束!");
            break;
        }
        write(fd2, str, res);
    }
}
int main(int argc, const char* argv[])
{
    // 打开文件
    int fd1, fd2;
    fd1 = open(argv[1], O_RDONLY);
    if (fd1 < 0)
        PRINT_ERR("open f1");
    fd2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (fd2 < 0)
        PRINT_ERR("open f2");

    // 获取要拷贝的文件大小
    size = lseek(fd1, 0, SEEK_END);
    lseek(fd1, 0, SEEK_SET);

    // 创建分支线程并把argv传给它
    char** pathname = argv;
    pthread_t tid;
    if (0 != pthread_create(&tid, NULL, t, (void*)pathname))
        return -1;

    // 主线程开始拷贝
    char str[128];
    ssize_t res;
    while (1) {
        if (lseek(fd1, 0, SEEK_CUR) > size / 2) {
            puts("父进程拷贝结束!");
            break;
        }
        res = read(fd1, str, sizeof(str));
        write(fd2, str, res);
    }

    // 等待分支线程结束
    pthread_join(tid, NULL);
    return 0;
}
y@DESKTOP-1DH5HNK:~/23071/IO/05day$ ls
01exc.c   02exc.c   03test.c  05pthread.c  test.bmp
01test.c  02test.c  04test.c  a.out
y@DESKTOP-1DH5HNK:~/23071/IO/05day$ ./a.out test.bmp cp.bmp
子进程拷贝结束!
父进程拷贝结束!
y@DESKTOP-1DH5HNK:~/23071/IO/05day$ diff test.bmp cp.bmp 
y@DESKTOP-1DH5HNK:~/23071/IO/05day$ 

2.要求定义一个全局变量 char buf[] = "1234567",创建两个线程,不考虑退出条件。

        A线程循环打印buf字符串,

        B线程循环倒置buf字符串,即buf中本来存储1234567,倒置后buf中存储7654321. B线程中不打印!!

        倒置不允许使用辅助数组。

        要求A线程打印出来的结果只能为 1234567 或者 7654321 不允许出现7634521 7234567

        不允许使用sleep函数

        分析出现错误的原因。

#include 

char buf[] = "1234567";
void invert(void)
{
    int i = 0, j = strlen(buf) - 1;
    char temp;
    while (i < j) {
        temp = buf[i];
        buf[i] = buf[j];
        buf[j] = temp;
        i++;
        j--;
    }
}
void* t1(void* arg)
{
    while (1) {
        // 标记为1时打印字符串,打印后把标记置0;
        if (*(char*)arg == 1) {
            puts(buf);
            *(char*)arg = 0;
        }
    }
}
void* t2(void* arg)
{
    while (1) {
        // 标记为0时倒置字符串,倒置后把标记置1;
        if (*(char*)arg == 0) {
            invert();
            *(char*)arg = 1;
        }
    }
}

int main(int argc, const char* argv[])
{
    char sign = 0; // 定义标记并置0
    pthread_t t1_id, t2_id;
    if (0 != pthread_create(&t1_id, NULL, t1, &sign))
        return -1;
    if (0 != pthread_create(&t2_id, NULL, t2, &sign))
        return -1;
        
    while (1) {
    }

    return 0;
}
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567
7654321
1234567

你可能感兴趣的:(c语言,linux)