IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux编程2:进程管理 -> 正文阅读

[系统运维]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
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:30:52  更:2022-05-08 08:33:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:49:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码