C语言_文件_进程_进程间通讯 常用函数/命令 + 实例
文件相关命令:
ps -aux|grep init? //搜索包含init名称的进程
top //linux下的资源管理器(动态)//open 返回的int 是给后面的读/写/光标移动 用的fd,没有open就不能进行后面的操作;
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
close(fd); //关闭文件// _t 都是返回的int数字;写write,读read,光标移动lseek
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
off_t lseek(int fd, off_t offset, int whence);//同时打开两个文件
vimdiff demo1.c demo2.c //fopen注意mode就行,有:r r+ w w+ a ,返回的文件指针是给后面的读 写 偏移用
FILE *fopen(const char *pathname, const char *mode);
fclose(FILE *); //关闭文件//跟上面的差不多一样用
//fread/fwrite(读写的数组,读写的大小, 读写的最大次数?, 读写的文件指针)(读写返回次数的区别:读为有效次数,能一次读完就算你写10次,也返回只读1次)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
int fseek(FILE *stream, long offset, int whence);fputc();//写入一个字符;
fgetc();//读取一个字符
feof();/检测是否到达文件末尾,到了返回1;文件结束符为EOF=-1;//注意:读写操作都会使光标偏移,但也可以利用这点来遍历读写文件;
例:
while(!feof(FILE* fd)){printf("%c ",fgetc(FILE* fd));
}
进程相关命令:
getpid(); fork(); vfork();
//_t 一律返回的是int
//获取进程ID 就是pid
pid_t getpid(void);//fork创建子进程
pid_t fork(void);
//这里返回的是的pid = 0 就是子进程,pid > 0 就是父进程;
//所以可以通过判断pid的值,来区别父子进程需要执行的代码;
//注意fork开辟的子进程,没有等待一说,父子进程谁抢到就先运行谁,
//【子进程为僵尸进程】;
//例:#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t pid;int num = 0;pid = getpid();printf("this pid:%d\n",getpid());pid_t return_pid = fork();if(return_pid > 0){while(1){printf("this father pid:%d return_pid:%d \n",getpid(),return_pid);printf("father now num:%d\n",num);sleep(1);}}else if(return_pid == 0){printf("this son pid:%d return_pid:%d \n",getpid(),return_pid);num += 2;printf("child now num:%d\n",num);exit(6);}
}//vfork创建子进程
pid_t vfork(void);
//注意fork开辟的子进程,会等待子进程执行完并exit(num)后,父子进程才继续执行,
//【子进程不会成为僵尸进程】;
//例:#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t pid;pid = getpid();printf("this pid:%d\n",getpid());int num = 0;printf("start_father_num:%d \n",num);pid_t return_pid = vfork();if(return_pid > 0){while(1){printf("this father pid:%d return_pid:%d \n",getpid(),return_pid);printf("num = %d\n",num);sleep(1);}}else if(return_pid == 0){int i;for(i=0;i<3;i++){printf("this son pid:%d return_pid:%d \n",getpid(),return_pid);num++;sleep(1);}exit(0);}return 0;
}
exit(6); wait(status); WEXITSTATUS(status);
子进程退出; 等待子进程; 获取子进程退出状态码;
//wait() 返回的是子进程的ID 即pid;
//里面的 int *status 是子进程的exit(num)的num码;
//后续使用WEXITSTATUS(status),即可打印出来子进程退出时的状态码;
pid_t wait(int *status);
//例:#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t pid;int status = 0;pid = getpid();printf("start father pid:%d\n",getpid());pid_t return_pid = fork();if(return_pid > 0 ){pid_t child_pid = wait(&status);printf("\n\nwait_return_childe_pid:%d\n",child_pid);printf("child exit code:%d \n",WEXITSTATUS(status));while(1){printf("this father pid:%d fork_return_pid:%d > 0 \n",getpid(),return_pid);sleep(1);}}else if(return_pid == 0){int i;for(i=0;i<3;i++){printf("this son pid:%d fork_return_pid:%d == 0 \n",getpid(),return_pid);}exit (6);}return 0;
}
exec组函数 对比 system + popen :(程序/进程跳转)
大佬精彩博文: https://blog.csdn.net/u014530704/article/details/73848573
观后感:
跟着execl/execlp指定的程序跑了,不回来了!
// date 获取时间的程序execl("./PATH","date","NULL");// execl(程序所在路径,程序名,结尾必须为NULL)// 就像这样用,在当前程序运行到这句代码时,// 便将替换为后续执行execl所指的程序,不带回头的那种!execlp("date","date",NULL);// execlp(程序名,程序名,结尾必须为NULL)// 就像这样用,它带p,能自己在环境变量下搜索对应的程序并替换后续执行;// 也是不带回头的那种!
相比较之下 system 执行完指定程序后,还会回来,挺好!
system("cat demo1.c");//执行完成后返回原程序,继续执行后续代码;
而对比popen 而言,popen除了将指定程序/代码执行完之后,继续执行后续代码外,还将读/写的内容放在管道内,并以文件指针的形式返回;
#include <stdio.h>
#include <unistd.h>
int main()
{printf("------------------------------------------------\nPS:\n");char* p = "ps";FILE *fd = popen(p,"r");char data[1024];fread(&data,1024,1,fd);printf("%s\n",data);perror("why");return 0;
}
进程间通讯:
int pipe(int pipefd[2]); (无名管道,在文件里看不到)
里面的fd[2]数组,其中 fd[0] : 读的fd, fd[1] : 写的fd;
例:通过在父子进程中 close (fd[0]/fd[1]) 配合read(); write(); 实现进程间通讯;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{printf("------------------------------------------------:\n");int fd[2];int n_pipe = pipe(fd);char data1[128];if(n_pipe < 0){printf("error: can not creat pipe!\n");perror("why");}int pid = fork();if(pid < 0){printf("error: creat child failed!\n");perror("why");}if(pid > 0){// sleep(2);printf("this is father pc\n");close(fd[0]);write(fd[1],"hello pipe from father;",strlen("hello pipe from father;"));close(fd[1]);}if(pid == 0){printf("this is child pc\n");close(fd[1]);read(fd[0],data1,128);printf("data : %s\n",data1);exit(9);}return 0;
}
打印:
mkfifo创建有名管道文件;成功返回0;失败返回-1并设置erron = -1;
返回值判断报错值:EEXIST,可以锁定报错为文件已存在目录中;
/*
int mkfifo(const char *pathname, mode_t mode);
RETURN VALUEOn success mkfifo() and mkfifoat() return 0. In the case ofan error, -1 is returned (in which case, errno is set appro‐priately).EEXIST pathname already exists. This includes the case wherepathname is a symbolic link, dangling or not.
*///例:
#include<stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
int main()
{if(mkfifo("./demo1.txt",0666) < 0 && errno == EEXIST ){printf("mkfifo error:\n");perror("why");}return 0;
}
mkfifo() 有名管道(会生成临时文件); 配合 open(); read(); write(); 实现进程间通讯;
例 mkread + mkwrite:
//demo mkread:
#include<stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main()
{char buf[30]={0};int nff = mkfifo("./demo10.txt",0600);if(nff < 0 || errno == EEXIST ){printf("mkfifo error:\n");perror("why");}if(nff == 0){printf("mkfifo OK! \n");}int fd = open("./demo10.txt",O_RDONLY);printf("open success\n");int n_read = read(fd,buf,30);printf("read %d byte frome fifo context:\n%s\n",n_read,buf);int n_sys = system("rm ./demo10.txt");if(n_sys < 0 || n_sys ==127 ){printf("./demo10.txt delect error! \n");perror("why");}else{printf("\n--------------------------------------------");printf("\nsystem: ./demo10.txt delect success !\n");printf("--------------------------------------------\n");}close(fd);return 0;
}
//demo mkwrite:
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main()
{char buf[30]={"hello mkfifo file_read/write"};int fd = open("./demo10.txt",O_WRONLY);printf("open success\n");int n_write = write(fd,buf,strlen(buf));printf("write %d byte give fifo context:\n%s\n",n_write,buf);close(fd);return 0;
}
打印:
相关文章:

C语言_文件_进程_进程间通讯 常用函数/命令 + 实例
文件相关命令: ps -aux|grep init? //搜索包含init名称的进程 top //linux下的资源管理器(动态)//open 返回的int 是给后面的读/写/光标移动 用的fd,没有open就不能进行后面的操作; int op…...

力扣第406题 根据身高重建队列 c++ 贪心思维
题目 406. 根据身高重建队列 中等 相关标签 贪心 树状数组 线段树 数组 排序 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &am…...

postgresSQL 数据库本地创建表空间读取本地备份SQL文件
使用pgAdmin4,你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步:找到Tablespaces 第二步:创建表空间名称 第三步:指向数据文件 第四步:找到Databases,创建表空间 第五步:输入数…...

贝锐花生壳内网穿透推出全新功能,远程业务连接更安全
贝锐旗下内网穿透兼动态域名解析品牌花生壳目前推出了全新的“访问控制”功能,可精确设置访问权限,充分保障信息安全,满足更多用户安全远程访问内网服务的需求。 通过这一功能,可实现指定时间、IP、地区等条件下才能远程访问映射的…...

NIO和BIO编程
一、网络通信编程基本常识 1、什么是Socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,一般由操作系统提供。 2、短连接 短连接是指socket建立连接之后传输数据确定接收完后关闭连接 3、长连接 长连接是指建立so…...

嵌入式系统设计师考试笔记之操作系统基础复习笔记二
目录 3、任务管理 (1)嵌入式操作系统的任务管理可以分为 (2)进程 (3)线程 (4)任务 (5)任务的创建与中止 (6)任务的状态任务有三…...

读图数据库实战笔记01_初识图
1. 图论 1.1. 起源于莱昂哈德欧拉在1736年发表的一篇关于“哥尼斯堡七桥问题”的论文 1.2. 要解决这个问题,该图需要零个或两个具有奇数连接的节点 1.3. 任何满足这一条件的图都被称为欧拉图 1.4. 如果路径只访问每条边一次,则该图具有欧拉路径 1.5…...

K-Means和KNN
主要区别 从无序 —> 有序 从K-Means —> KNN KNN:监督学习,类别是已知的,对已知分类的数据进行训练和学习,找到不同类的特征,再对未分类的数据进行分类。K-Means:无监督学习,事先不知道…...

【Python】【Flask】flask_login的初始化
【背景】 想要更高效地用现有的Flask_login包来实现用户管理方面的常用功能会话管理等。不想再手搓了。 【要点】 首先引入flask_login from flask_login import LoginManager, login_user, login_required, logout_user,current_user然后进行app级别的设置和初始化 login…...

Spring Cloud之API网关(Gateway)
目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) …...

nodejs+vue 电子书阅读系统
本文首先介绍了电子书阅读系统的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,随着网络技术的不断发展,多媒体技术应用渐渐的出现在教育领域中,电子书阅读已经成为社会的一个热…...

百度文心一言4.0抢先体验教程!
🍁 展望:关注我, AI学习之旅上,我与您一同成长! 一、 引言 想快速体验文心一言4.0,但又觉得技术难度太高?别担心,我来手把手教你! 🚀 10月17日,文心一言4.0…...

单目3D目标检测 方法综述——直接回归方法、基于深度信息方法、基于点云信息方法
本文综合整理单目3D目标检测的方法模型,包括:基于几何约束的直接回归方法,基于深度信息的方法,基于点云信息的方法。万字长文,慢慢阅读~ 直接回归方法 涉及到模型包括:MonoCon、MonoDLE、MonoFlex、CUPNet…...

oracle,CLOB转XML内存不足,ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE“,
通过kettle采集数据时,表输入的组件,查询报错。 ORA-27163: out of memory ORA-06512: at “SYS.XMLTYPE”, line 272 ORA-06512: at line 1 通过 ALTER SESSION SET EVENTS ‘31156 trace name context forever, level 0x400’; 修改会话配置 或直接修改…...

PHP与mysql数据库交互
PHP与mysql数据库交互 文章目录 PHP与mysql数据库交互方法速查建立与Mysql链接捕获连接错误SQL语句的执行SQL 错误SQL语句执行结果集对象方法速查 案例 方法速查 函数名 作用 mysqli_connect() 与MySQL 数据库建立连接。 mysqli_close() 关闭与MYSQL 数据库建…...

【广州华锐视点】VR飞行员驾驶模拟实训系统
VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术,可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境,包括天气、地形、飞机性能等,使被试者能够在虚拟环境中进行飞行操作,从而提高其…...

太烂的牌也要打完只为自己也不是为了其他什么原因。
day17_io02 1.上课代码敲一遍 2.读取一个文件,这个文件中有随机的一些数字字符,统计这些数字有几个偶数,几个奇数,并且追加写入到该文件末尾。 例如: a.txt文件: 3241256364789629090126581212515 奇数&…...

SDL窗口创建以及简单显示(1)
项目创建步骤 1. 使用Qt Creator创建一个C项目 2. 将SDL库文件放到源文件目录下 在项目pro文件中添加库文件 win32{INCLUDEPATH $$PWD/SDL2-2.0.10/includeLIBS $$PWD/SDL2-2.0.10/lib/x86/SDL2.lib } 使用SDL创建一个窗口 #include <stdio.h>#include <SDL.h>…...

【Html】交通灯问题
效果 实现方式 计时器:setTimeout或setInterval来计时。setInterval和 setTimeout 在某些情况下可能会出现计时不准确的情况。这通常是由于JavaScript的事件循环机制和其他代码执行所需的时间造成的。 问询:通过getCurrentLight将每个状态的持续时间设置…...

用IntelliJ远程打断点调试
前提当然是本地和远程部署的代码一样。 记录下步骤: 1,用token登录kuboard,找到目标容器的IP: 2, 用上一步找到的IP等信息创建Remote JVM Debug: 3,打断点,wkb说要把断点此属性改为线程。我试了下似乎…...

Spring-Bean的生命周期概述
Bean的生命周期概述 入门使用的Spring代码: ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("spring.xml"); UserService userService (UserService) context.getBean("userService"); userService.test(); …...

SENet 学习
ILSVRC 是一个比赛,全称是ImageNet Large-Scale Visual Recognition Challenge,平常说的ImageNet比赛指的是这个比赛。 使用的数据集是ImageNet数据集的一个子集,一般说的ImageNet(数据集)实际上指的是ImageNet的这个子…...

目前和未来的缓存构建
说起来可能有点反直觉,有时候不运行反而可以帮助我们加快速度,这正是网络浏览器运行的指导原则。不必在页面上加载所有内容,缓存的元素已经存在,不需要每次访问网站或网页时都重新加载。页面加载速度越快,浏览器的工作…...

aws亚马逊云免费账号代充值!!!什么是 AWS Lambda?
AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。 Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量调配和弹性伸缩和记录。使用 Lambda,您…...

《从零开始大模型开发与微调 :基于PyTorch与ChatGLM》简介
内 容 简 介 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架,以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术,…...

【LeetCode】102. 二叉树的层序遍历
题目链接 文章目录 Python3方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二: 深度优先搜索 (DFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯ C方法一: 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n…...

golang连接池检查连接失败时如何重试
在Go中,可以通过使用database/sql包的DB类型的Ping方法来检查数据库连接的可用性。如果连接检查失败,可以选择进行重试。以下是一个简单的示例代码,演示了如何在连接检查失败时进行重试: import ("database/sql""…...

从JavaScript到Rust的三年时间小结
Rust 是一种注重安全性、速度和并发性的系统编程语言。它能编译成高效的本地代码,无需垃圾回收即可访问内存等底层资源,同时还能防止分隔故障。 作者讨论了他们几年来用 Rust 构建大型应用程序和库的经验。他们发现 Rust 的借用检查器和类型系统有助于减…...

【Python机器学习】零基础掌握VotingRegressor集成学习
如何更准确地预测房价? 想象一下,你是一名房地产分析师,你的任务是预测一个小区的未来房价。这看似简单,但实际上,房价受到多种因素的影响,如地理位置、房屋面积、周围设施等。你可能会使用线性回归模型来进行预测,但是你会发现,尽管模型的准确性还可以,但还是存在一…...

云计算模式的区域LIS系统源码,基于ASP.NET+JQuery、EasyUI+MVC技术架构开发
云计算模式的区域LIS系统源码 云LIS系统源码,自主版权 LIS系统是专为医院检验科的仪器设备能与计算机连接。可通过LIS系统向仪器发送指令,让仪器自动操作和接收仪器数据。并快速的将检验仪器中的数据导入到医生工作站中进行管理,且可将检验结…...