文章目录
1.文件操作
1.1 stat()函数`
#include <sys/stat.h>
int stat(const char *path,struct stat *buf)
参数说明:
- path:文件路径
- buf:缓冲区,用于接收获取到的文件属性
功能说明:
获取文件属性。文件的属性存储于incode中,因此该函数实际上是从incode结构体中获取文件信息。
返回值说明:
成功:返回0。
失败:返回-1,并设置
1.2 access()函数:
#include <unistd.h>
int access(const char *pathname,int mode)
参数说明:
- pathname:文件名
- mode:
- R_OK:具备读的权限
- W_OK:具备写的权限
- X_OK:具备执行的权限
- F_OK:测试文件是否存在
功能说明:
测试文件是否拥有某种权限
返回值说明:
返回0:调用成功,并且指定文件存在或具有某种权限。
返回-1:调用失败,或者文件不存在或不具备某种权限。
1.3 chmod()函数:
#include <sys/stat.h>
int chmod(const char *path,mode_t mode)
参数说明:
- path:路径名
- mode:传递修改后的权限
功能说明:
用于修改文件的权限。
返回值说明:
成功:返回0
失败:返回-1,并设置error的值
1.4 truncate()函数:
#include <sys/stat.h>
int truncate(const char *path,off_t length)
参数说明:
-path:路径名
- length:文件大小
功能说明:
用于修改文件的大小,常用于扩展文件。
返回值说明:
成功:返回0
失败:返回-1,并设置error的值
2.进程控制
2.1创建进程
#include <unistd.h>
pid_t fork(void)
功能说明:
使用该函数创建进程,执行后,系统会创建一个与原进程近乎相同的进程,之后父子都继续往下执行。
调用fork()函数创建的进程为子进程,调用fork()函数的进程为父进程。
返回值说明:
成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0。
失败:原程序不会被复制,父进程的fork()函数返回-1.
案例:使用fork()函数创建一个进程,进程创建成功之后使父进程与子进程分别执行不同的功能
test_fork.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t tempPid;
tempPid = fork();
if(tempPid == -1){
perror("fork error");
}else if(tempPid > 0){//parent
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}else{//child
printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
}//of if
printf("......finish......");
return 0;
}//of main
思考1:多次执行文件test_fork会发现这种情况:child process后输出的ppid不等于parent process的pid,而等于1,分析出现这种情况的原因。
原因:由于出现了父进程在子进程之前终止,导致紫禁城变成了孤儿进程,后面由init进程来接收,而init进程号为1.
2.2 创建多个进程:
对上面的代码进行修改,使用下列代码
int i;
for(i = 0; i < 2; i ++){
tempPid = fork();
}//of for i
在循环的过程当中,除了父进程会创建之外,父进程的子进程在第二次循环的过程当中也会创建进程。因此循环n次所得到的进程个数并不是n个,而是2的n次方。
若想仅父进程可以创建新进程,可进行相应的判断:
test_fork2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t tempPid;
int i;
for(i = 0; i < 2; i ++){
if((tempPid = fork()) == 0){
break;
}//of if
}//of for i
if(tempPid == -1){
perror("fork error");
}else if(tempPid > 0){//parent
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}else{//child
printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
}//of if
printf("......finish......");
return 0;
}//of main
思考2:分析上述代码的输出结果,发现输出结果有以下问题:
1.子进程的编号并不是递增输出的
2.终端提示符后面仍然有子进程信息打印,而命令提示符在最后一行的开头闪烁
出现原因:
1.由于父子进程之间的优先级是一致的,cpu随机选择进行执行
2.终端也是进程,与创建的父子进程一起竞争资源,cpu在选择的时候进行随机选择导致。
2.3 控制进程的执行顺序:使用sleep()函数,暂缓程序执行
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t tempPid;
int i;
for(i=0;i<5;i++){
tempPid=fork();
if(tempPid==0){
break;
}//of if
}//of for i
if(tempPid==-1){
perror("fork error");
exit(1);
}else if(tempPid>0){//of parent
sleep(5);
printf("parent pid=%d\n",getpid());
}else if(tempPid==0){//of child
sleep(i);
printf("I am child%d pid=%d\n",i+1,getpid());
}//of if
return 0;
}//of main
最终效果: