linux编程2:进程管理
文件操作补充
书接上回,上一篇中提到了两个头文件
#include<sys/types.h>
#include<sys/stat.h>
前者提供类型pid_t, size_t的定义
后者中封装的函数,实现获取文件(普通文件,目录,管道,socket,字符,块 ) 的属性
access函数
#include <unistd.h>
int access(const char *pathname, int mode);
检测文件是否具有某种权限
pathname 指定文件路径
mode :有四种参数可选:R_OK, W_OK, X_OK, F_OK ,分别是读,写,执行和文件是否存在
stat函数
#include<sys/stat.h>
int stat(const char *path, struct stat *buf);
用于获取文件属性
path: 文件路径
buf: 接受文件所拥有的属性:大小,类型等等
chmod函数
int chmod(const char *path, mode_t mode);
类似于linux操作中的chmod指令,修改文件的权限
mode:修改的权限
mode值:
标志位 | 说明 |
---|
S_IRUSR | 文件所有者的读取权限位 | S_IWUSR | 文件所有者的写入权限位 | S_IXUSR | 文件所有者的执行权限位 | S_IRWXU | S_IRUSR|S_IWUSR|S_IXUSR | S_IRGRP | 文件用户组的读取权限位 | S_IWGRP | 文件用户组的写入权限位 | S_IXGRP | 文件用户组的执行权限位 | S_IRWXG | S_IRGRP|S_IWGRP|S_IXGRP | S_IROTH | 文件其他用户的读取权限位 | S_IWOTH | 文件其他用户的写入权限位 | S_IXOTH | 文件其他用户的执行权限位 | S_IRWXO | S_IROTH|S_IWOTH|S_IXOTH | S_ISUID | 文件的 (set user-id on execution)位 | S_ISGID | 文件的 (set group-id on execution)位 | S_ISVTX | 文件的sticky 位 |
truncate函数
int truncate(const char *path, off_t length);
用于修改文件大小,类似lseek函数
length为文件大小
进程管理
老规矩,先讲讲函数
fork()
#include <unistd.h>
pid_t fork(void);
用于创建一个子进程
成功:返回子进程的pid
失败:返回-1
子进程使用的fork()的返回值为0
注意:
1. fork()之后,父进程和子进程执行代码的顺序是不一定的。和内核调度算法有关。 2. fork()之前的代码父进程和子进程都会执行
sleep函数
#include <unistd.h>
sleep(x);
延迟调用进程,以秒为单位
单进程创建
#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){
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}else{
printf("child process, pid = %d, ppid = %d\n", getpid(), getppid());
}
printf("......finish......\n");
return 0;
}
存在一个问题:多次执行test_fork会发现,child process后输出的ppid不等于parent process的pid
这里出现个1252的ppid,按理说应该和父进程的pid相同,所以此处出问题了
那么问题的原因是什么?
子进程和父进程的优先级相同,会同时竞争CPU,所以其执行代码的顺序不定
父进程如果被优先选取,那么就会优先终止,而进程终止回收机制是由进程的父进程执行,此时父进程被回收了,而其子进程就没有父进程了,就成孤儿进程了,
创建多个子进程
利用子进程的fork返回值为0进行判断,进行循环
#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;
}
}
if(tempPid == -1){
perror("fork error");
}else if(tempPid > 0){
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}else{
printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
}
printf("......finish......\n");
return 0;
}
实验 存在问题:
(1)子进程的编号不是递增的; (2)终端提示符后面仍然有子进程信息打印,而命令提示符在最后一行的开头闪烁。 这是为什么?
原因:子进程的创建不会按代码执行顺序创建,并顺序分配pid,而是随机分配,而且在执行中还会产生孤儿进程。
解决办法:通过sleep进行阻塞,暂缓进程执行
#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;
}
}
if(tempPid == -1){
perror("fork error");
}else if(tempPid > 0){
sleep(3);
printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
}else{
sleep(i);
printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
}
printf("......finish......\n");
return 0;
}
|