文件I/O(PART)与进程控制(PART)
part : 文件操作
||stat()函数
功能:用于获取文件的属性;
参数说明:
path:文件路径;
buf:接收获取到的文件属性;文件属性存储在inode中,函数从inode结构体中获取文件信息。
案例:使用stat()函数获取文件属性,并且输出文件的大小
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/stat.h> int main() { struct stat sbuf; int ret = 2; ret = stat("a.out", &sbuf); if (ret == -1){ perror("stat error:"); exit(1); } printf("len=%ld\n", sbuf.st_size); return 0; }
输出:len = 7401
||access()函数
功能:用于测试文件是否拥有某种权限;
参数说明:
pathname:文件名;
mode:取值有4个:R_OK, W_OK, X_OK, F_OK;前面3个是测试文件是否有读、写、执行权限,最后一个测试文件是否存在。
返回值说明:
成功:0,表示文件存在或具有某种权限。
不成功:-1并设置errno
||chmod()函数
功能:用于修改文件的访问权限;
参数说明:
path:路径名;
mode:传递修改后的权限。
返回值说明:
成功:0,表示文件存在或具有某种权限;
不成功:-1并设置errno。
||truncate()函数
功能:用于修改文件大小,常用于扩展文件,其功能与lseek函数类似;
参数说明:
path:路径名;
length:设置文件大小。
返回值说明:
成功:0;
不成功:-1并设置errno。
||link()
part : 进程控制【fork()】
||fork()函数
功能:创建进程;函数执行后,系统会创建一个与原进程几乎相同的进程,之后父子进程都继续执行,如图所示:
返回值说明:
成功:返回两个值,子进程创建成功后,原程序会被复制,就有了两个fork函数。父进程的fork函数会返回子进程的pid,子进程的fork函数会返回0.
不成功:若子进程创建失败,原程序不会复制,父进程的fork函数返回-1。
||创建单个进程
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); //调用fork()函数创建子进程 if (pid == -1) //创建失败 { perror("fork error"); exit(1); //退出进程,指定返回值1 } else if (pid > 0) //父进程 { printf("parent process,pid=%d,ppid=%d\n", getpid(), getppid()); } else if (pid == 0) //子进程 { printf("child process,pid=%d,ppid=%d\n", getpid(), getppid()); } printf("........finish..........\n"); return 0; }
由于父进程for循环会出现4个进程,极大浪费cpu,所以此方法创建多个进程会,cpu的负担会出现直指数级增长。
优化进程创建||创建多个进程
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; int i; for (i = 0; i<5; i++){ //循环创建进程 if ((pid = fork()) == 0) //若当前进程为子进程,便跳出循环 break; } if (pid == -1){ perror("fork error"); exit(1); } else if (pid>0){ //父进程 printf("parent process:pid=%d\n", getpid()); } else if (pid == 0){ //子进程 printf("I am child=%d,pid=%d\n", i + 1, getpid()); } return 0; }
if语句判断当前进程不是父进程则跳出循环,这样优化下创建多个进程cpu的运算就是一次函数的线性增长。然而又会出现新的问题。
输出结果为
可见创建的子进程id是乱序的,也就是说,子进程创建出来由于优先级和父进程一样,会和父进程竞争cpu,这不是个优解。
创建多个进程优化版||加入sleep()
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; int i; for (i = 0; i<5; i++){ //循环创建进程 if ((pid = fork()) == 0) //若当前进程为子进程,便跳出循环 break; } if (pid == -1){ perror("fork error"); exit(1); } else if (pid>0){ //父进程 sleep(5); printf("parent process:pid=%d\n", getpid()); } else if (pid == 0){ //子进程 sleep(i); printf("I am child=%d,pid=%d\n", i + 1, getpid()); } return 0; }
如此,实现进程创建的合理有序,不会对cpu造成额外负担,over!!!!!!!