IO进程
2023-09-09 09:58:14 0 举报
AI智能生成
IO进程函数总结
作者其他创作
大纲/内容
open、close
read、write
lseek
函数
练习:2.实现“head -n 文件名”命令的功能:显示文件前n行例:head -3 test.c -> ./a.out -3 test.catoi :将字符串转化成整型数 \"1234\" -- 1234 \"-3\"-- -33.用文件IO实现cp功能 ./a.out src dest//读多少,写多少
练习:3.用文件IO实现cp功能 ./a.out src dest//读多少,写多少
文件IO
1.将源文件编译生成目标文件 gcc -c xxx.c -o xxx.o2.创建静态库用ar命令ar crs libxxx.a xxx.o静态库命名规则:lib为库的前缀,xxx为库名,.a 为静态库的后缀(扩展名)3.测试静态库的使用gcc xxx.c -L指定库的路径 -l指定库名执行./a.out
静态库
1.用gcc创建动态库gcc -fPIC -c xxx.c -o xxx.o-fPIC 创建与地址无关的编译程序 gcc -shared -o libxxx.so xxx.o动态库命名规则:lib为前缀,xxx为动态库名,.so为动态库的后缀(扩展名)2.测动态库的使用gcc xxx.c -L指定库的路径 -l指定库名执行./a.out
(1)把库拷贝到/usr/lib和/lib目录下。
(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。
(3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新
三种方法解决动态库运行报错
动态库
库
pid_t fork(void);功能:创建子进程返回值:成功:在父进程中:返回子进程的进程号 >0在子进程中:返回值为0失败:-1并设置errno
fork
void exit(int status);功能:结束进程,刷新缓存参数:退出的状态不返回。void _exit(int status);功能:结束进程,不刷新缓存参数:status是一个整型的参数,可以利用这个参数传递进程结束时的状态。通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束
exit _exit
wait waitpid
pid_t getpid(void);功能:获取当前进程的进程号pid_t getppid(void);功能:获取当前进程的父进程号
getpid getppid
1.exec函数族
练习:创建一个守护进程,循环间隔1s向文件中写入一串字符“hello”
2.守护进程
int pipe(int fd[2])功能:创建无名管道参数:文件描述符 fd[0]:读端 fd[1]:写端返回值:成功 0失败 -1
pipe
练习:父子进程实现通信,父进程循环从终端输入数据,子进程循环打印数据,当输入quit结束。提示:管道自带同步机制。
无名管道(pipe))
练习:两个不相干进程,用有名管道实现cp (17分钟)./input src./output dest
mkfifo
、有名管道(fifo
kill 、raise、pause
unsigned int alarm(unsigned int seconds)功能:在进程中设置一个定时器参数:seconds:定时时间,单位为秒返回值:如果调用此alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。注意:一个进程只能有一个闹钟时间。如果在调用alarm时已设置过闹钟时间,则之前的闹钟时间被新值所代替
alarm
signal
练习:用信号的知识实现司机和售票员问题。1)售票员捕捉SIGINT(代表开车)信号,向司机发送SIGUSR1信号,司机打印(let's gogogo)2)售票员捕捉SIGQUIT(代表停车)信号,向司机发送SIGUSR2信号,司机打印(stop the bus)3)司机捕捉SIGTSTP(代表到达终点站)信号,向售票员发送SIGUSR1信号,售票员打印(please get off the bus)4)司机等待售票员下车,之后司机再下车。
信号(sem)
1.早期的进程间通信:
ftok
shmget
shmat
int shmdt(const void *shmaddr);功能:取消映射参数:要取消的地址返回值:成功0 失败的-1
shmdt()
shmctl()
2.练习两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束(19分钟)共享内存输入一次,打印一次。标志位int char、struct shm{int flagchar buf}struct shm * p = shmat();
共享内存(share memory)
msgget()
msgsnd()
msgrcv()
msgctl()
消息队列(message queue)
semget()
semctl()
semop
5.练习共享内存+信号灯集实现,两个进程实现通信,一个进程循环从终端输入,另一个进程循环打印,当输入quit时结束(20分钟)
信号灯集(semaphore)
2.systerm V IPC(Inter-Process Communication\")对象:
套接字(socket)
3.BSD:
进程间通信方式
2.练习:通过父子进程完成对文件的拷贝(cp),父进程从文件开始到文件的一半开始拷贝,子进程从文件的一半到文件末尾。要求:文件IO cp src dest提示:1)文件一半lseek2)最后一次读剩下的1000-32-32 183)fork之前打开文件?还是之后?
font color=\"#7bd144\
进程
BCD-LSP
fopen 、fclose
fgetc、fputc
fgets、fputs
freopen fseek ftell rewind
feof、ferror
fread、fwrite
练习: 用fgetc fputc实现cat 文件名功能。--》./a.out 文件名( 17分钟)
2.练习:通过fgets实现\"wc -l 文件名\"命令功能(计算文件行数)char buf[32]//每一行一定小于32?
练习 :用标准IO实现(cp 源文件 目标文件)功能
练习:2.实现“head -n 文件名”命令的功能:显示文件前n行例:head -3 test.c -> ./a.out -3 test.catoi :将字符串转化成整型数 \"1234\" -- 1234 \"-3\"-- -3
标准IO
DIR *opendir(const char *name);功能:获得目录流参数:要打开的目录返回值:成功:目录流失败:NULLint closedir(DIR *dirp);功能:关闭目录参数:dirp:目录流
opendir closedir
directory entrystruct dirent *readdir(DIR *dirp);功能:读目录参数:要读的目录流返回值:成功:读到的信息失败:NULL,设置errno号返回值为结构体,该结构体成员为描述该目录下的文件信息struct dirent {ino_t d_ino; /* 索引节点号*/off_t d_off; /*在目录文件中的偏移*/unsigned short d_reclen; /* 文件名长度*/unsigned char d_type; /* 文件类型 */char d_name[256]; /* 文件名 */};
readdir
练习:实现ls
目录操作
state
struct group *getgrgid(gid_t gid);功能:通过组 id 获取组属性参数:gid:组 id返回值:返回保存组相关属性结构体的地址 err:NULL struct group { char *gr_name; /* 组名 */ char *gr_passwd; /* 组密码 */ gid_t gr_gid; /* 组ID */ char **gr_mem; /*组成员账号 */ };
getgrgid
struct passwd *getpwuid(uid_t uid);功能:通过用户 id 获取用户属性参数:uid:用户 id返回值:返回保存用户相关属性结构体的地址失败:NULLstruct passwd {char *pw_name; /* 用户名 */char *pw_passwd; /* 密码 */uid_t pw_uid; /* user ID */gid_t pw_gid; /* group ID */char *pw_gecos; /* 真实名 */char *pw_dir; /* 主目录 */char *pw_shell; /* 使用的shell */};
getpwuid()
char *ctime(const time_t *timep); 功能:将时间秒数转化为字符串表示 参数:timep :时间 返回值:成功返回字符串首地址 失败:NULL
ctime
获取文件属性
pthread_create pthread_exit
pthread_join pthread_detach
练习:通过线程实现数据的交互,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。(13分钟)提示:1)全局变量 2)输入一次,打印一次--》同步--》标志位 标志位:int flag可输出(输入完成)/不可输出状态(打印完成)
sem_init()
int sem_wait(sem_t *sem) 功能:申请资源 P操作 参数:sem:信号量对象返回值:成功 0 失败 -1
sem_wait()
int sem_post(sem_t *sem) 功能:释放资源 V操作 参数:sem:信号量对象返回值:成功 0 失败 -1注:释放一次信号量的值加1,函数不阻塞
sem_post()
练习:通过线程实现数据的交互,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。输入一次,打印一次
同步,信号量实现
pthread_mutex_init() pthread_mutex_destroy()
int pthread_mutex_lock(pthread_mutex_t *mutex)功能:申请互斥锁参数:mutex:互斥锁返回值:成功 0失败 -1注:和pthread_mutex_trylock区别:pthread_mutex_lock是阻塞的;pthread_mutex_trylock不阻塞,如果申请不到锁会立刻返回int pthread_mutex_unlock(pthread_mutex_t *mutex)功能:释放互斥锁参数:mutex:互斥锁返回值:成功 0失败 -1
pthread_mutex_lock() pthread_mutex_unlock()
互斥的函数
pthread_cond_init() pthread_cond_destroy()
pthread_cond_wait() pthread_cond_signal()
条件变量的函数
互斥和条件变量
线程
IO进程
0 条评论
回复 删除
下一页