linux编程2:进程管理

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_IRWXUS_IRUSR|S_IWUSR|S_IXUSR
S_IRGRP文件用户组的读取权限位
S_IWGRP文件用户组的写入权限位
S_IXGRP文件用户组的执行权限位
S_IRWXGS_IRGRP|S_IWGRP|S_IXGRP
S_IROTH文件其他用户的读取权限位
S_IWOTH文件其他用户的写入权限位
S_IXOTH文件其他用户的执行权限位
S_IRWXOS_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);

延迟调用进程,以秒为单位

单进程创建

//fork1.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......\n");
	return 0;
}//of main

存在一个问题:多次执行test_fork会发现,child process后输出的ppid不等于parent process的pid

在这里插入图片描述

这里出现个1252的ppid,按理说应该和父进程的pid相同,所以此处出问题了

那么问题的原因是什么?

子进程和父进程的优先级相同,会同时竞争CPU,所以其执行代码的顺序不定

父进程如果被优先选取,那么就会优先终止,而进程终止回收机制是由进程的父进程执行,此时父进程被回收了,而其子进程就没有父进程了,就成孤儿进程了,

创建多个子进程

利用子进程的fork返回值为0进行判断,进行循环

//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......\n");
	return 0;
}//of main

实验
在这里插入图片描述
存在问题:

(1)子进程的编号不是递增的;
(2)终端提示符后面仍然有子进程信息打印,而命令提示符在最后一行的开头闪烁。
这是为什么?

原因:子进程的创建不会按代码执行顺序创建,并顺序分配pid,而是随机分配,而且在执行中还会产生孤儿进程。

解决办法:通过sleep进行阻塞,暂缓进程执行

//fork3.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
		sleep(3);
        printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
	}else{//child
        sleep(i);
		printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
	}//of if
	printf("......finish......\n");
	return 0;
}//of main
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值