学习目标:
- 了解文件操作的相关函数及其用法
- 初步学习进程管理
学习内容:
文件操作
1.函数:
stat()
access()
chmod()
truncate()
link()
stat():
1 #include <sys/stat.h>
2 int stat(const char *path, struct stat *buf);
功能:用于获取文件的属性;
参数说明:
path:文件路径;
buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。
返回值说明:
成功:0
不成功:-1并设置errno
文件stat结构体中st_size成员
对于所有的文件类型,st_size成员对其中的普通文件、目录以及符号链接有实在的意义。其中,对于普通文件而言,st_size记录了该文件的实际大小;对于目录而言,st_size的值为16或者512的倍数;对于符号链接而言,st_size的值为符号链接所指的路径的长度。例如lib->usr/lib,则st_size的值即为7。在某些Unix系统中,st_size的值对pipe等文件也有意义,表示当前pipe中可以读取的字节数。
下面参照老师的案例来实现一下
这是1.txt文件里面的内容,下面我们运行一下
可以看到上面显示的长度是18,那么我们只有16个字符,为什么上面会显示18呢?首先从代码的角度来说,st_size表示文件的大小而并非长度,只是和长度有关,所以用len的话不如用size。其次,通过多次测试发现,一个空文件的大小是1,换行符在文件中的大小是1,那么我们就不难理解为什么16和字符的长度会显示18了。
access():
#include <unistd.h>`
int access(const char *pathname, int mode);
具体内容就不多说了,写了个实例,让我们来尝试一下
这里我们先设置1.txt的权限为777(rwx,具体可自行百度),
可以看到1.txt是有可读权限的,然后我们再设置一下
改成771之后再运行一下
可以看到我们没有权限访问了,在经过多次测试之后发现access函数对于测试权限的对象为others,并不是用户及用户组的权限。
chmod():
1 #include <sys/stat.h>
2 int chmod(const char *path, mode_t mode);
功能:用于修改文件的访问权限;就是在上面用命令行变成了用c语言执行==,这里不多解释了
truncate():
1 #include <sys/stat.h>
2 int truncate(const char *path, off_t length);
功能:用于修改文件大小,常用于扩展文件,其功能与lseek函数类似;
参数说明:
path:路径名;
length:设置文件大小。
返回值说明:
成功:0;
不成功:-1并设置errno。
进程管理
1 进程控制
fork()
exec函数族
wait()
exit()
1.1 创建进程
1 #include <unistd.h>
2 pid_t fork(void);
功能:创建进程;函数执行后,系统会创建一个与原进程几乎相同的进程,之后父子进程都继续执行,
参数说明:无
返回值说明:
成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0.
不成功:若子进程创建失败,原程序不会复制,父进程的fork函数返回-1。
下面来运行一下案例1
【思考 1】多次执行test_fork会发现,child process后输出的ppid不等于parent process的pid,而等于1。请说明原因。
【提示】出现这种情况,是因为父进程先于子进程终止,子进程变成“孤儿进程”,后面由init进程来接收。
案例2
如果只希望父进程可以创建新进程,则在for循环中添加一个判断:若当前进程不是父进程,则跳出循环。
提示:
在Linux系统中,子进程应由父进程回收,但是当子进程被创建后,它与它的父进程及其它进程共同竞争系统资源,所以父子进程执行的顺序是不确定的,终止的先后顺序也是不确定的。
Shell命令提示符也是1个进程,它需要和新建进程一起竞争CPU。
案例3
利用sleep函数,暂缓进程执行
那么本次的作业就到这里了,如有不足请多多指点😁
参考链接:
https://blog.csdn.net/search_129_hr/article/details/124476473
https://blog.csdn.net/dahailantian1/article/details/78584751