IO进程
2023-09-09 09:58:14 0 举报
AI智能生成
IO进程函数总结
作者其他创作
大纲/内容
文件IO
函数
open、close
int open(const char *pathname, int flags);<br>功能:打开文件<br>参数:pathname:文件路径名<br>flags:打开文件的方式<br>O_RDONLY:只读 O_WRONLY:只写 O_RDWR:可读可写 O_CREAT:创建 O_TRUNC:清空<br>O_APPEND:追加<br>返回值:成功:文件描述符<br>失败:-1<br>当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限<br>int open(const char *pathname, int flags, mode_t mode);<br>创建出来的文件权限为指定权限值&(~umask) //umask为文件权限掩码<br><br>int close(int fd);<br>功能:关闭文件<br>参数:fd:文件描述符<br>
read、write
ssize_t read(int fd, void *buf, size_t count);<br>功能:从一个已打开的可读文件中读取数据<br>参数:fd 文件描述符<br>buf 存放位置<br>count 期望的个数<br>返回值:成功:实际读到的个数<br>返回-1:表示出错,并设置errno号<br>返回0:表示读到文件结尾<br><br>ssize_t write(int fd, const void *buf, size_t count);<br>功能:向指定文件描述符中,写入 count个字节的数据。<br>参数:fd 文件描述符<br>buf 要写的内容<br>count 期望值<br>返回值:成功:实际写入数据的个数<br>失败 : -1
lseek
off_t lseek(int fd, off_t offset, int whence);<br>功能:设定文件的偏移位置<br>参数:fd:文件描述符<br>offset偏移量<br>正数:向文件结尾位置移动<br>负数:向文件开始位置<br>whence 相对位置<br>SEEK_SET 开始位置<br>SEEK_CUR 当前位置<br>SEEK_END 结尾位置<br>返回值:成功:文件的当前位置<br>失败:-1
<font color="#7bd144"><b>练习:2.实现“head -n 文件名”命令的功能:显示文件前n行<br>例:head -3 test.c -> ./a.out -3 test.c<br>atoi :将字符串转化成整型数 "1234" -- 1234 "-3"-- -3<br>3.用文件IO实现cp功能 ./a.out src dest<br>//读多少,写多少</b></font><br>
<font color="#7bd144"><b>练习:3.用文件IO实现cp功能 ./a.out src dest<br>//读多少,写多少</b></font>
库
静态库
1.将源文件编译生成目标文件<br> gcc -c xxx.c -o xxx.o<br>2.创建静态库用ar命令<br>ar crs libxxx.a xxx.o<br>静态库命名规则:lib为库的前缀,xxx为库名,.a 为静态库的后缀(扩展名)<br>3.测试静态库的使用<br>gcc xxx.c -L指定库的路径 -l指定库名<br>执行./a.out<br>
动态库
1.用gcc创建动态库<br>gcc -fPIC -c xxx.c -o xxx.o<br>-fPIC 创建与地址无关的编译程序<br> gcc -shared -o libxxx.so xxx.o<br>动态库命名规则:lib为前缀,xxx为动态库名,.so为动态库的后缀(扩展名)<br>2.测动态库的使用<br>gcc xxx.c -L指定库的路径 -l指定库名<br>执行./a.out<br>
三种方法解决动态库运行报错
(1)把库拷贝到/usr/lib和/lib目录下。
(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。
(3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新<br>
进程
函数
fork
pid_t fork(void);<br>功能:创建子进程<br>返回值:<br>成功:在父进程中:返回子进程的进程号 >0<br>在子进程中:返回值为0<br>失败:-1并设置errno
exit _exit
void exit(int status);<br>功能:结束进程,刷新缓存<br>参数:退出的状态<br>不返回。<br><br>void _exit(int status);<br>功能:结束进程,不刷新缓存<br>参数:status是一个整型的参数,可以利用这个参数传递进程结束时的状态。<br>通常0表示正常结束;<br>其他的数值表示出现了错误,进程非正常结束
wait waitpid
pid_t wait(int *status);<br>功能:回收子进程资源(阻塞)<br>参数:status:子进程退出状态,不接受子进程状态设为NULL<br>返回值:成功:回收的子进程的进程号<br>失败:-1<br><br>pid_t waitpid(pid_t pid, int *status, int options);<br>功能:回收子进程资源<br>参数:<br>pid:>0 指定子进程进程号<br>=-1 任意子进程<br>=0 等待其组ID等于调用进程的组ID的任一子进程<br><-1 等待其组ID等于pid的绝对值的任一子进程<br>status:子进程退出状态<br>options:0:阻塞<br>WNOHANG:非阻塞<br>返回值:正常:结束的子进程的进程号<br>当使用选项WNOHANG且没有子进程结束时:0<br>出错:-1
getpid getppid<br>
pid_t getpid(void);<br>功能:获取当前进程的进程号<br>pid_t getppid(void);<br>功能:获取当前进程的父进程号
1.exec函数族<br>
2.守护进程<br>
<font color="#7bd144"><b>练习:创建一个守护进程,循环间隔1s向文件中写入一串字符“hello”</b></font><br>
进程间通信方式
1.早期的进程间通信:
无名管道(pipe))
pipe
int pipe(int fd[2])<br>功能:创建无名管道<br>参数:文件描述符 fd[0]:读端 fd[1]:写端<br>返回值:成功 0<br>失败 -1
<font color="#7bd144"><b>练习:父子进程实现通信,父进程循环从终端输入数据,子进程循环打印数据,当输入quit结束。<br>提示:管道自带同步机制。</b></font><br>
、有名管道(fifo
mkfifo
int mkfifo(const char *filename,mode_t mode);<br>功能:创健有名管道<br>参数:filename:有名管道文件名<br>mode:权限<br>返回值:成功:0<br>失败:-1,并设置errno号<br>注意对错误的处理方式:<br>如果错误是file exist时,注意加判断,如:if(errno == EEXIST)
<font color="#7bd144"><b>练习:两个不相干进程,用有名管道实现cp (17分钟)<br>./input src<br>./output dest</b></font><br>
<font color="#7bd144"><b>练习:两个不相干进程,用有名管道实现cp (17分钟)<br>./input src<br>./output dest</b></font><br>
信号(sem)
kill 、raise、pause
int kill(pid_t pid, int sig);<br>功能:信号发送<br>参数:pid:指定进程<br>sig:要发送的信号<br>返回值:成功 0<br>失败 -1<br><br>int raise(int sig);<br>功能:进程向自己发送信号<br>参数:sig:信号<br>返回值:成功 0<br>失败 -1<br><br>int pause(void);<br>功能:用于将调用进程挂起,直到捕捉到信号为止(返回)。
alarm
unsigned int alarm(unsigned int seconds)<br>功能:在进程中设置一个定时器<br>参数:seconds:定时时间,单位为秒<br>返回值:如果调用此alarm()前,进程中已经设置了闹钟时间,则<br>返回上一个闹钟时间的剩余时间,否则返回0。<br>注意:一个进程只能有一个闹钟时间。如果在调用alarm时<br>已设置过闹钟时间,则之前的闹钟时间被新值所代替
signal
sighandler_t signal(int signum, sighandler_t handler);<br>功能:信号处理函数<br>参数:signum:要处理的信号<br>handler:信号处理方式<br>SIG_IGN:忽略信号<br>SIG_DFL:执行默认操作<br>handler:捕捉信号 void handler(int sig){} //函数名可以自定义<br>返回值:成功:设置之前的信号处理方式<br>失败:-1
<font color="#7bd144"><b>练习:用信号的知识实现司机和售票员问题。<br>1)售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印(let's gogogo)<br>2)售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印(stop the bus)<br>3)司机捕捉SIGTSTP(代表到达终点站)信号,向售票员发送SIGUSR1信号,售票员打印(please get off the bus)<br>4)司机等待售票员下车,之后司机再下车。</b></font><br>
2.systerm V IPC(Inter-Process Communication")对象:
共享内存(share memory)
<br>
ftok
key_t ftok(const char *pathname, int proj_id);<br>功能:产生一个独一无二的key值<br>参数:<br>Pathname:已经存在的可访问文件的名字<br>Proj_id:一个字符(因为只用低8位)<br>返回值:成功:key值<br>失败:-1
shmget
<br>int shmget(key_t key, size_t size, int shmflg);<br>功能:创建或打开共享内存<br>参数:<br>key 键值<br>size 共享内存的大小<br>shmflg IPC_CREAT|IPC_EXCL(判错)|0666<br>返回值:成功 shmid<br>出错 -1(已编辑)
shmat<br>
void *shmat(int shmid,const void *shmaddr,int shmflg);<br>功能:映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问<br>参数:<br>shmid 共享内存的id号<br>shmaddr 一般为NULL,表示由系统自动完成映射<br>如果不为NULL,那么由用户指定<br>shmflg:SHM_RDONLY就是对该共享内存只进行读操作<br>0 可读可写<br>返回值:成功:完成映射后的地址,<br>失败:-1的地址
shmdt() <br>
int shmdt(const void *shmaddr);<br>功能:取消映射<br>参数:要取消的地址<br>返回值:成功0 <br> 失败的-1<br>
shmctl()
int shmctl(int shmid,int cmd,struct shmid_ds *buf);<br>功能:(删除共享内存),对共享内存进行各种操作<br>参数:<br> shmid 共享内存的id号<br> cmd IPC_STAT 获得shmid属性信息,存放在第三参数<br> IPC_SET 设置shmid属性信息,要设置的属性放在第三参数<br> IPC_RMID:删除共享内存,此时第三个参数为NULL即可<br>返回:成功0 <br> 失败-1<br>用法:<br>shmctl(shmid,IPC_RMID,NULL);
<font color="#7bd144"><b>2.练习<br>两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束(19分钟)<br>共享内存<br>输入一次,打印一次。标志位<br>int char、<br>struct shm<br>{<br>int flag<br>char buf<br>}<br>struct shm * p = shmat();</b></font><br>
消息队列(message queue)
msgget()<br>
int msgget(key_t key, int flag);<br>功能:创建或打开一个消息队列<br>参数: key值<br>flag:创建消息队列的权限IPC_CREAT|IPC_EXCL|0666<br>返回值:成功:msgid<br>失败:-1
msgsnd()
int msgsnd(int msqid, const void *msgp, size_t size, int flag);<br>功能:添加消息<br>参数:msqid:消息队列的ID<br>msgp:指向消息的指针。常用消息结构msgbuf如下:<br>struct msgbuf{<br>long mtype; //消息类型<br>char mtext[N]}; //消息正文<br>size:发送的消息正文的字节数<br>flag:IPC_NOWAIT消息没有发送完成函数也会立即返回<br>0:直到发送完成函数才返回<br>返回值:成功:0<br>失败:-1
msgrcv()
int msgrcv(int msgid, void* msgp, size_t size, long msgtype, int flag);<br>功能:读取消息<br>参数:msgid:消息队列的ID<br>msgp:存放读取消息的空间<br>size:接受的消息正文的字节数<br>msgtype:0:接收消息队列中第一个消息。<br>大于0:接收消息队列中第一个类型为msgtyp的消息.<br>小于0:接收消息队列中类型值不小于msgtyp的绝对值且类型值又最小的消息。<br>flag:0:若无消息函数会一直阻塞<br>IPC_NOWAIT:若没有消息,进程会立即返回ENOMSG<br>返回值:成功:接收到的消息的长度<br>失败:-1
msgctl()
int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );<br>功能:对消息队列的操作,删除消息队列<br>参数:msqid:消息队列的队列ID<br>cmd:<br>IPC_STAT:读取消息队列的属性,并将其保存在buf指向的缓冲区中。<br>IPC_SET:设置消息队列的属性。这个值取自buf参数。<br>IPC_RMID:从系统中删除消息队列。<br>buf:消息队列缓冲区<br>返回值:成功:0<br>失败:-1
信号灯集(semaphore)
semget()<br>
int semget(key_t key, int nsems, int semflg);<br>功能:创建/打开信号灯<br>参数:key:ftok产生的key值<br>nsems:信号灯集中包含的信号灯数目<br>semflg:信号灯集的访问权限,通常为IPC_CREAT |IPC_EXCL |0666<br>返回值:成功:信号灯集ID<br>失败:-1
semctl()
int semctl ( int semid, int semnum, int cmd…/*union semun arg*/);<br>功能:信号灯集合的控制(初始化/删除)<br>参数:semid:信号灯集ID<br>semnum: 要操作的集合中的信号灯编号<br>cmd:<br>GETVAL:获取信号灯的值,返回值是获得值<br>SETVAL:设置信号灯的值,需要用到第四个参数:共用体<br>IPC_RMID:从系统中删除信号灯集合<br>返回值:成功 0<br>失败 -1<br>用法:初始化:<br>union semun{<br>int val;<br>}mysemun;<br>mysemun.val = 10;<br>semctl(semid, 0, SETVAL, mysemun);<br>获取信号灯值:函数semctl(semid, 0, GETVAL)的返回值<br>删除信号灯集:semctl(semid, 0, IPC_RMID);
semop
int semop ( int semid, struct sembuf *opsptr, size_t nops);<br>功能:对信号灯集合中的信号量进行PV操作<br>参数:semid:信号灯集ID<br>opsptr:操作方式<br>nops: 要操作的信号灯的个数 1个<br>返回值:成功 :0<br>失败:-1<br>struct sembuf {<br>short sem_num; // 要操作的信号灯的编号<br>short sem_op; // 0 : 等待,直到信号灯的值变成0<br>// 1 : 释放资源,V操作<br>// -1 : 申请资源,P操作<br>short sem_flg; // 0(阻塞),IPC_NOWAIT, SEM_UNDO<br>};<br>用法:<br>申请资源 P操作:<br>mysembuf.sem_num = 0;<br>mysembuf.sem_op = -1;<br>mysembuf.sem_flg = 0;<br>semop(semid, &mysembuf, 1);<br>释放资源 V操作:<br>mysembuf.sem_num = 0;<br>mysembuf.sem_op = 1;<br>mysembuf.sem_flg = 0;<br>semop(semid, &mysembuf, 1);
<font color="#7bd144"><b>5.练习<br>共享内存+信号灯集实现,两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束(20分钟)</b></font><br>
3.BSD:
套接字(socket)
<font color="#7bd144"><b>2.练习:<br>通过父子进程完成对文件的拷贝(cp),父进程从文件开始到文件的一半开始拷贝,子进程从文件的一半到文件末尾。要求:文件IO cp src dest<br>提示:1)文件一半lseek<br>2)最后一次读剩下的1000-32-32 18<br>3)fork之前打开文件?还是之后?</b></font><br>
<font color="#7bd144"><b>练习:题目要求:编程读写一个文件test.txt,每隔1秒向文件中写入一行数据,类似这样: <br>1, 2007-7-30 15:16:42 <br>2, 2007-7-30 15:16:43<br>该程序应该无限循环,直到按Ctrl+C中断程序。<br>再次启动程序写文件时可以追加到原文件之后,并且序号能够接续上次的序号,比如: <br>1, 2007-7-30 15:16:42<br>2, 2007-7-30 15:16:43<br>3, 2007-7-30 15:19:02<br>4, 2007-7-30 15:19:03<br>5, 2007-7-30 15:19:04<br>提示:1.sleep(1)<br>2.fopen a+<br>3.计算行号<br>4.时间:<br>//time:获取从1970年1月1日0时0分0秒到现在的秒数<br>//localtime:将时间秒数转化成结构体<br>//sprintf ->sprintf(buf,"%d-%d",year,month);<br>//fprintf ->fprintf(fp,"%d-%d",year,month);//缓冲区?</b></font><br>
标准IO
BCD-LSP
函数
fopen 、fclose<br>
fgetc、fputc
fgets、fputs
char * fgets(char *s, int size, FILE * stream);<br>功能:从文件中每次读取一行字符串<br>参数:s:存放字符串的地址<br>size:一次读取的字符个数<br>stream:文件流<br>返回值:成功:s的地址<br>失败或读到文件末尾:NULL<br>特性:每次实际读取的字符个数为size-1个,会在末尾自动添加\0<br>每次读一行,遇到\n后不再继续,读下一行<br>int fputs(const char *s, FILE * stream);<br>功能:向文件中写字符串<br>参数:s:要写的内容<br>stream:文件流<br>返回值:成功:非负整数<br>失败:EOF
freopen fseek ftell rewind
FILE * freopen(const char *pathname, const char *mode, FILE* fp)<br>功能:将指定的文件流重定向到打开的文件中<br>参数:path:文件路径<br>mode:打开文件的方式(同fopen)<br>fp:文件流指针<br>返回值:成功:返回文件流指针<br>失败:NULL
feof、ferror
fread、fwrite
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);<br>功能:从文件流读取多个元素<br>参数: ptr :用来存放读取元素<br>size :元素大小 sizeof(数据类型)<br>nmemb :读取元素的个数<br>stream :要读取的文件<br>返回值:成功:读取的元素的个数;<br>读到文件尾: 0<br>失败: -1<br><br>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);<br>功能:按对象写<br>参数:同上<br>返回值:成功:写的元素个数<br>失败 :-1
<font color="#7bd144"><b>练习: 用fgetc fputc实现cat 文件名功能。--》./a.out 文件名( 17分钟)</b></font><br>
<font color="#7bd144"><b>2.练习:通过fgets实现"wc -l 文件名"命令功能(计算文件行数)<br>char buf[32]<br>//每一行一定小于32?</b></font>
<font color="#7bd144"><b>练习 :用标准IO实现(cp 源文件 目标文件)功能</b></font><br>
<font color="#7bd144"><b>练习:2.实现“head -n 文件名”命令的功能:显示文件前n行<br>例:head -3 test.c -> ./a.out -3 test.c<br>atoi :将字符串转化成整型数 "1234" -- 1234 "-3"-- -3</b></font><br>
目录操作
opendir closedir <br>
DIR *opendir(const char *name);<br>功能:获得目录流<br>参数:要打开的目录<br>返回值:成功:目录流<br>失败:NULL<br><br>int closedir(DIR *dirp);<br>功能:关闭目录<br>参数:dirp:目录流<br>
readdir
directory entry<br>struct dirent *readdir(DIR *dirp);<br>功能:读目录<br>参数:要读的目录流<br>返回值:成功:读到的信息<br>失败:NULL,设置errno号<br>返回值为结构体,该结构体成员为描述该目录下的文件信息<br>struct dirent {<br>ino_t d_ino; /* 索引节点号*/<br>off_t d_off; /*在目录文件中的偏移*/<br>unsigned short d_reclen; /* 文件名长度*/<br>unsigned char d_type; /* 文件类型 */<br>char d_name[256]; /* 文件名 */<br>};
<font color="#7bd144"><b>练习:实现ls</b></font><br>
获取文件属性
state
int stat(const char *path, struct stat *buf);<br>功能:获取文件属性<br>参数:path:文件路径名<br>buf:保存文件属性信息的结构体<br>返回值:成功:0<br>失败:-1<br>struct stat {<br>dev_t st_dev; /* 设备包含文件ID */<br>ino_t st_ino; /* inode号 */<br>mode_t st_mode; /* 文件类型和权限 */<br>nlink_t st_nlink; /* 硬链接数 */<br>uid_t st_uid; /* 用户ID */<br>gid_t st_gid; /* 组ID */<br>off_t st_size; /* 大小 */<br>dev_t st_rdev; /* 设备ID */<br>time_t st_atime; /* 最后访问时间 */<br>time_t st_mtime; /* 最后修改时间 */<br>time_t st_ctime; /* 最后状态改变时间 */<br>};
getgrgid
struct group *getgrgid(gid_t gid);<br>功能:通过组 id 获取组属性<br>参数:gid:组 id<br>返回值:返回保存组相关属性结构体的地址 err:NULL<br> struct group {<br> char *gr_name; /* 组名 */<br> char *gr_passwd; /* 组密码 */<br> gid_t gr_gid; /* 组ID */<br> char **gr_mem; /*组成员账号 */<br> };
getpwuid()<br>
struct passwd *getpwuid(uid_t uid);<br>功能:通过用户 id 获取用户属性<br>参数:uid:用户 id<br>返回值:返回保存用户相关属性结构体的地址<br>失败:NULL<br>struct passwd {<br>char *pw_name; /* 用户名 */<br>char *pw_passwd; /* 密码 */<br>uid_t pw_uid; /* user ID */<br>gid_t pw_gid; /* group ID */<br>char *pw_gecos; /* 真实名 */<br>char *pw_dir; /* 主目录 */<br>char *pw_shell; /* 使用的shell */<br>};
ctime
char *ctime(const time_t *timep);<br> 功能:将时间秒数转化为字符串表示<br> 参数:timep :时间<br> 返回值:成功返回字符串首地址<br> 失败:NULL
线程
函数
pthread_create pthread_exit
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,<br>void *(*start_routine) (void *), void *arg);<br>功能:创建线程<br>参数:thread:线程标识<br>attr:线程属性, NULL:代表设置默认属性<br>start_routine:函数名:代表线程函数<br>arg:用来给前面函数传参<br>返回值:成功:0<br>失败:错误码<br><br>int pthread_exit(void *value_ptr)<br>功能:用于退出线程的执行<br>参数:value_ptr:线程退出时返回的值(任意类型)<br>返回值:成功 : 0<br>失败:errno<br>
pthread_join pthread_detach
int pthread_join(pthread_t thread, void **value_ptr)<br>功能:用于等待一个指定的线程结束,阻塞函数<br>参数:thread:创建的线程对象<br>value_ptr:指针*value_ptr指向线程返回的参数<br>返回值:成功 : 0<br>失败:errno<br><br>int pthread_detach(pthread_t thread);<br>功能:让线程结束时自动回收线程资源,让线程和主线程分离<br>参数:thread:线程ID
<b><font color="#7bd144">练习:<br>通过线程实现数据的交互,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。(13分钟)<br>提示:1)全局变量<br> 2)输入一次,打印一次--》同步--》标志位<br> 标志位:int flag可输出(输入完成)/不可输出状态(打印完成)</font></b><br>
同步,信号量实现
sem_init()
int sem_init(sem_t *sem, int pshared, unsigned int value) <br>功能:初始化信号量 <br>参数:sem:初始化的信号量对象<br> pshared:信号量共享的范围(0: 线程间使用 非0:1进程间使用)<br> value:信号量初值<br>返回值:成功 0<br> 失败 -1
sem_wait()
int sem_wait(sem_t *sem) <br>功能:申请资源 P操作 <br>参数:sem:信号量对象<br>返回值:成功 0<br> 失败 -1
sem_post()
int sem_post(sem_t *sem) <br>功能:释放资源 V操作 <br>参数:sem:信号量对象<br>返回值:成功 0<br> 失败 -1<br>注:释放一次信号量的值加1,函数不阻塞
<b><font color="#7bd144">练习:通过线程实现数据的交互,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。输入一次,打印一次</font></b><br>
互斥和条件变量
互斥的函数
pthread_mutex_init() <br>pthread_mutex_destroy()<br>
int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr)<br>功能:初始化互斥锁<br>参数:mutex:互斥锁<br>attr: 互斥锁属性 // NULL表示缺省属性<br>返回值:成功 0<br>失败 -1<br><br>int pthread_mutex_destroy(pthread_mutex_t *mutex)<br>功能:销毁互斥锁<br>参数:mutex:互斥锁<br>
pthread_mutex_lock() <br>pthread_mutex_unlock()
int pthread_mutex_lock(pthread_mutex_t *mutex)<br>功能:申请互斥锁<br>参数:mutex:互斥锁<br>返回值:成功 0<br>失败 -1<br>注:和pthread_mutex_trylock区别:pthread_mutex_lock是阻塞的;pthread_mutex_trylock不阻塞,如果申请不到锁会立刻返回<br><br>int pthread_mutex_unlock(pthread_mutex_t *mutex)<br>功能:释放互斥锁<br>参数:mutex:互斥锁<br>返回值:成功 0<br>失败 -1<br><br>
条件变量的函数
pthread_cond_init() <br>pthread_cond_destroy()<br>
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);<br>功能:初始化条件变量<br>参数:cond:是一个指向结构pthread_cond_t的指针<br>restrict attr:是一个指向结构pthread_condattr_t的指针,一般设为NULL<br>返回值:成功:0 失败:非0<br><br>注:必须等待pthread_cond_wait函数先执行,再产生条件才可以<br>int pthread_cond_destroy(pthread_cond_t *cond);<br>功能:将条件变量销毁<br>参数:cond:条件变量值<br>返回值:成功:0, 失败:非0
pthread_cond_wait() <br>pthread_cond_signal()
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);<br>功能:等待信号的产生<br>参数:restrict cond:要等待的条件<br>restrict mutex:对应的锁<br>返回值:成功:0,失败:不为0<br>注:当没有条件产生时函数会阻塞,同时会将锁解开;如果等待到条件产生,函数会结束阻塞同时进行上锁。<br><br>int pthread_cond_signal(pthread_cond_t *cond);<br>功能:给条件变量发送信号<br>参数:cond:条件变量值<br>返回值:成功:0,失败:非0
<font color="#7bd144"><b>3.练习:<br>两个线程:一个线程循环倒置,一个线程循环打印<br>int a[10]={0,1,2,3,4,5,6,7,8,9}<br>锁谁-》临界区<br>上锁(申请)--》倒置--》解锁(释放)<br>上锁(申请)--》打印--》解锁(释放)</b></font><br>
0 条评论
下一页