C语言用线程的方式实现cp函数–mycopy
前面介绍了文件io和标准io的mycopy函数,现在我们用线程的方式从命令行传参来实现mycopy函数
/*=============================================================================
#
# 创建者: 小卫
#
# Last modified: 2021-07-06 19:34
#
# Filename: practice.c
#
# Description(描述): 用线程从命令行传参实现mycopy
#
=============================================================================*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
// 定义全局变量,信号量
sem_t sem;
// 共享缓冲区
char buf[100];
// 子线程读函数
void *fun_read(void *arg)
{
// printf("arg = %s",(char *)arg);
// 以只读的方式打开目标文件
FILE *fp = fopen((char *)arg,"r");
if (fp == NULL)
{
perror("fopen r");
exit(-1);
}
while (1)
{
// 缓冲区清零
memset(buf,0,sizeof(buf));
// 读数据
int ret = fread(buf,1,sizeof(buf),fp);
// printf("%s",buf);
if (ret == 0)
{
printf("读取完成!\n");
// 信号量加1,由于下面是break,这里要在子线程结束前加1
sem_post(&sem);
break;
}
// 信号量+1
sem_post(&sem);
}
}
int main(int argc, const char *argv[])
{
if (argc != 3)
{
printf("请输入文件名\n");
return -1;
}
// 以只写的方式打开目标文件
FILE *fd = fopen(argv[2],"w");
if (fd == NULL)
{
perror("fopen w");
exit(-1);
}
// 定义线程的tid
pthread_t tid1;
// 创建线程,线程指向fun_read函数,参数为argv[1]
int ret = pthread_create(&tid1,NULL,fun_read,(void *)argv[1]);
if (ret < 0)
{
perror("pthread_create");
exit(-1);
}
// 回收线程,以非阻塞的方式
pthread_detach(tid1);
// 初始化信号量,第一个0代表线程,非0代表进程,第二个0为初始化值
sem_init(&sem,0,0);
while (1)
{
// 信号量减1,信号量如果为0,就以阻塞的方式等待
sem_wait(&sem);
// 向目标文件写入数据
int ret = fwrite(buf,1,strlen(buf),fd);
// printf("ret = %d\n",ret);
if (ret == 0)
{
printf("复制完成\n");
break;
}
}
return 0;
}