linux教程之linux体系下c言语编程进门--线程操纵
买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比查man文档快.特别适合英语不好。程的创立和利用
线程的创立是用上面的几个函数来完成的.
#include<pthread.h>
intpthread_create(pthread_t*thread,pthread_attr_t*attr,
void*(*start_routine)(void*),void*arg);
voidpthread_exit(void*retval);
intpthread_join(pthread*thread,void**thread_return);
pthread_create创立一个线程,thread是用来标明创立线程的ID,attr指出线程创立时分的属性,我们用NULL来标明利用缺省属性.start_routine函数指针是线程创立乐成后入手下手实行的函数,arg是这个函数的独一一个参数.标明传送给start_routine的参数.pthread_exit函数和exit函数相似用来加入线程.这个函数停止线程,开释函数的资本,并在最初堵塞,直到其他线程利用pthread_join函数守候它.然后将*retval的值传送给**thread_return.因为这个函数开释以是的函数资本,以是retval不克不及够指向函数的部分变量.pthread_join和wait挪用一样用来守候指定的线程.上面我们利用一个实例来注释一下利用办法.在理论中,我们常常要备份一些文件.上面这个程序能够完成以后目次下的一切文件备份.备份后的后缀名为bak
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<pthread.h>
#include<dirent.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/time.h>
#defineBUFFER512
structcopy_file{
intinfile;
intoutfile;
};
void*copy(void*arg)
{
intinfile,outfile;
intbytes_read,bytes_write,*bytes_copy_p;
charbuffer,*buffer_p;
structcopy_file*file=(structcopy_file*)arg;
infile=file->infile;
outfile=file->outfile;
/*由于线程加入时,一切的变量空间都要被开释,以是我们只好本人分派内存了*/
if((bytes_copy_p=(int*)malloc(sizeof(int)))==NULL)pthread_exit(NULL);
bytes_read=bytes_write=0;
*bytes_copy_p=0;
/*还记得怎样拷贝文件吗*/
while((bytes_read=read(infile,buffer,BUFFER))!=0)
{
if((bytes_read==-1)&&(errno!=EINTR))break;
elseif(bytes_read>0)
{
buffer_p=buffer;
while((bytes_write=write(outfile,buffer_p,bytes_read))!=0)
{
if((bytes_write==-1)&&(errno!=EINTR))break;
elseif(bytes_write==bytes_read)break;
elseif(bytes_write>0)
{
buffer_p+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1)break;
*bytes_copy_p+=bytes_read;
}
}
close(infile);
close(outfile);
pthread_exit(bytes_copy_p);
}
intmain(intargc,char**argv)
{
pthread_t*thread;
structcopy_file*file;
intbyte_copy,*byte_copy_p,num,i,j;
charfilename;
structdirent**namelist;
structstatfilestat;
/*失掉以后路径上面一切的文件(包括目次)的个数*/
if((num=scandir(".",&namelist,0,alphasort))<0)
{
fprintf(stderr,"GetFileNumError:%s
a",strerror(errno));
exit(1);
}
/*给线程分派空间,实在没有需要这么多的*/
if(((thread=(pthread_t*)malloc(sizeof(pthread_t)*num))==NULL)||
((file=(structcopy_file*)malloc(sizeof(structcopy_file)*num))==NULL)
)
{
fprintf(stderr,"OutOfMemory!
a");
exit(1);
}
for(i=0,j=0;i<num;i++)
{
memset(filename, ,BUFFER);
strcpy(filename,namelist->d_name);
if(stat(filename,&filestat)==-1)
{
fprintf(stderr,"GetFileInformation:%s
a",strerror(errno));
exit(1);
}
/*我们疏忽目次*/
if(!S_ISREG(filestat.st_mode))continue;
if((file.infile=open(filename,O_RDONLY))<0)
{
fprintf(stderr,"Open%sError:%s
a",filename,strerror(errno));
continue;
}
strcat(filename,".bak");
if((file.outfile=open(filename,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))
<0)
{
fprintf(stderr,"Creat%sError:%s
a",filename,strerror(errno
));
continue;
}
/*创立线程,举行文件拷贝*/
if(pthread_create(&thread,NULL,copy,(void*)&file)!=0)
fprintf(stderr,"CreateThread[%d]Error:%s
a",i,strerror(errno));
j++;
}
byte_copy=0;
for(i=0;i<j;i++)
{
/*守候线程停止*/
if(pthread_join(thread,(void**)&byte_copy_p)!=0)
fprintf(stderr,"Thread[%d]JoinError:%s
a",
i,strerror(errno));
else
{
if(bytes_copy_p==NULL)continue;
printf("Thread[%d]Copy%dbytes
a",i,*byte_copy_p);
byte_copy+=*byte_copy_p;
/*开释我们在copy函数内里创立的内存*/
free(byte_copy_p);
}
}
printf("TotalCopyBytes%d
a",byte_copy);
free(thread);
free(file);
exit(0);
}
</p>
对于开发环境的选择尽量要轻量级和高度可定制,航空母舰级别的工具往往会让你迷惑不解; 在学习的过程中,我们用的是VM虚拟机,开始时真的不真的该怎么去做,特别是我的是命令窗口界面,别人的是图形界面,我都不知道怎么调过来。 即便是非英语国家的人发布技术文档,Linux也都首先翻译成英语在国际学术杂志和网络上发表。 笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机 熟悉并掌握安装Linux,安装是学习的前提。目前较常见的安装方法有二种: 随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。 这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。 Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
页:
[1]