Linux——主函数的三个参数,printf方法的隐藏缓冲区

2023-10-30

主函数的三个参数

在windows下,c语言的主函数默认有两个参数;
很多人会惊奇,这是什么,好像从没有听说过????
我们在写C代码的时候都是习惯性的新建空项目然后自己添加.cpp文件,但是可能有部分人习惯直接新建控制台程序,然后可能就会看到这么一段代码,其实两个参数是负责接收指令行参数的,很多在linux gcc或者g++下编译过c程序的人都知道他的指令格式是:

	gcc 源文件名 -o 生成文件名

ps -f也是这个道理。
在Linux下,我们的主函数是有三个参数的:

int main(int argc,char *argv[],char * envp)
  • argc:主函数的参数个数
  • argv:主函数的参数内容
  • envp:环境变量(默认情况下,环境变量是从父进程继承而来的)

在这里插入图片描述
我们可以看到如下的执行结果:
在这里插入图片描述

也就是主函数拿到的第一个参数就是:当前程序的路径全名称

在这里插入图片描述
上述指令中,hello和123都是传给主函数的参数,都是以字符串的形式接收
因此,若写成下面的形式,参数就发生了变化:
在这里插入图片描述
我们加入环境变量的输出:
在这里插入图片描述
envp的最后一个参数是空指针。
如下图所示,显示了部分的环境变量:在这里插入图片描述
然后,我们增加一个自己的环境变量,命令如下:
在这里插入图片描述
在这里插入图片描述
总是,对于主函数参数的学习就到这里,实际上bash是main的父进程,bash帮我们把main进程运行起来,我们在bash中新增加了一个环境变量,所以main运行,会得到MYSTR这个环境变量。

printf方法的隐藏缓冲区

向屏幕输出显示信息时,C语言会使用printf方法,但实际上,它不会将输出结果直接输出到屏幕上,首先是将其要输出的内容写入到缓冲区中,待缓冲区放满后,就会把缓冲区的内容输出到屏幕上。
设立隐藏缓冲区的原因:
——效率,printf输出的内容要打印到屏幕上,是需要调用系统接口来完成的,屏幕是硬件设备,是由操作系统来管理的,因此它在输出时需要调用系统接口来完成,也就需要从用户态切换到内核态,如果我们多次调用printf,那么就会在这两种状态之间来回切换,造成很大的开销。
只有满足以下三种情况之一,才会将缓冲区中的内容输出到屏幕:

  1. 缓冲区满
  2. 强制刷新缓冲区fflush(stdout)或者加上\n
  3. 程序结束时
    在这里插入图片描述
    运行后,程序是先闪五秒空格才出现输出,原因是进程先刷新缓冲区再退出,调用exit(0)后,先刷新缓冲区,再调用_exit(0)(真正退出进程的方法),因为该方法只会退出进程,不会刷新缓冲区
    在这里插入图片描述
    若将代码修改为_exit(0)方法,则不会将缓冲区的内容输出到屏幕上,
    在这里插入图片描述
    若给printf后加上\n也会刷新缓冲区,同样强制刷新也可以输出到屏幕上:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

小总结

  • 其实C语言中的标准IO函数(不仅仅是printf),都是具有缓存功能的;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux——主函数的三个参数,printf方法的隐藏缓冲区 的相关文章

  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 软件配置管理(二)配置管理角色与过程

    文章目录 一 配置管理角色及职责 项目经理 PM 配置控制委员会 CCB 配置管理员 CMO 系统集成员 SIO 开发人员 DEV 二 配置管理基本流程 计划阶段 开发和维护阶段 三 软件配置管理七项基本活动 1 制定配置管理计划 2 识别
  • ubuntu2004/1804安装编译RocksDB

    Linux Ubuntu下载依赖 Upgrade your gcc to version at least 4 8 to get C 11 support Install gflags First try sudo apt get inst
  • XSS十五关通关秘籍

    文章来源 MS08067 Web零基础1期作业 本文作者 ymsli Web零基础1期学员 第一关 url输入关键字 完成第一关 第二关 文本框内输入 nclick alert 123 gt 点击搜索 文本框已被添加onclick事件 点击
  • 面试总结:测试常见面试题汇总

    文章目录 理论 测试流程 各个测试阶段 单元测试 集成测试 系统测试区别 测试用例设计 什么是好的测试用例 方法 用户登录 实例 App测试和Web测试的区别 典型测试场景 聊天功能测试用例怎么设计 怎么测试微信朋友圈 TODO 怎么测试微
  • do_mmap解读

    1 unsigned long do mmap pgoff struct file file unsigned long addr 2 unsigned long len unsigned long prot 3 unsigned long
  • Chat Gpt 4.0 API接口技术对接

    GPT Generative Pre trained Transformer 是一种基于Transformer网络架构的自然语言处理模型 能够生成自然 连贯的语言文本 GPT API接口技术是指将GPT模型应用于API接口开发 使得通过AP
  • ML-机器学习基础

    目录 偏差与方差 导致偏差和方差的原因 深度学习中的偏差与方差 生成模型与判别模型 两者之间的联系 优缺点 常见模型 先验概率与后验概率 偏差与方差 偏差与方差分别是用于衡量一个模型泛化误差的两个方面 模型的偏差 指的是模型预测的期望值与真
  • 大数据单机学习环境搭建(5)Hive建表DDL详解

    专题 大数据单机学习环境搭建和使用 1 Hive建表简单示例 1 1 Hive建表语句 1 2 表详细信息 1 3 数据展示 2 Hive建表语法详解 3 拓展1 复杂数据分割 4 拓展2 事务表 大数据单机学习环境搭建 5 Hive建表D
  • Linux中使用ctrl+z停止任务后如何恢复任务

    ctrl z的作用是停止任务 要恢复停止的任务要使用fg命令 root localhost jobs 1 已停止 top root localhost fg 1 fg 任务序号 直接用fg命令 恢复的是最新停止的一条任务
  • 1流明等于多少lux_投影仪流明科普,别再被商家骗了

    一 简介 流明 英文 Lumen 简写 lm 是光通量的国际单位 光通量 luminous flux 代表了我们人眼对不同波长的光的变化铭感度 我们一般说的投影仪流明指的是 ANSI流明 这个是国际公认的标准单位 在不同位置对投影仪进行测量
  • vue3+vite+element-plus+husky+commitzen搭建项目

    1 1 编辑器统一编码规范 http editorconfig org root true 表示所有文件适用 charset utf 8 设置文件字符集为 utf 8 indent style space 缩进风格 tab space in
  • 【WIFI】WIFI基本知识汇总

    这里对wifi的802 11协议中比较常见的知识做一个基本的总结和整理 便于后续的学习 因为无线网络中涉及术语很多 并且许多协议都是用英文描述 所以有些地方翻译出来会有歧义 这种情况就直接英文来描述了 主要内容 目录 一 基本概述 1 有线
  • Concurrent Mark Sweep(cms)垃圾回收器

    好长时间没写过博客了 突发奇想 开始写下最近几年的积累吧 先从Concurrent Mark Sweep cms 开始 希望自己没有太懒吧 坚持写完吧 先介绍以下概念 GC ROOT 这里我引用下RednaxelaFX的原话 所谓 GC r
  • Linux串口相关的操作及绑定

    Linux串口相关的操作及绑定 操作串口出现权限不足情况处理 要查看某个串口的波特率等信息 cat打印串口数据 排查问题常用方法 1 查看串口是否可用 2 查看串口名称使用 3 查看串口驱动 4 查看串口设备 5 查一下板子上的串口有没有设
  • 【策略工厂模式】使用策略工厂模式解决if else过多的问题

    目录 一 为什么要用策略工厂解决问题 1 1 使用策略模式之前 1 2使用策略模式之后 二 怎么用策略工厂模式解决问题 2 1 创建枚举类 2 2 创建抽象类 2 3 创建工厂类 2 4 编写子类型 三 意义 一 为什么要用策略工厂解决问题
  • Tensorflow加载预训练模型和保存模型(ckpt文件)以及迁移学习finetuning

    转载自 https blog csdn net huachao1001 article details 78501928 使用tensorflow过程中 训练结束后我们需要用到模型文件 有时候 我们可能也需要用到别人训练好的模型 并在这个基
  • 快速理解图神经网络(GCN)

    网上对图卷积神经网络 Graph Convolutional Networks 的介绍大都说的云里雾里 让人看了不甚明白 无意中找到了篇很好的文章 对图神经网络中 f H i A
  • 前端下载二进制流文件

    前端下载文件有两种方法 第一种 后台直接返回下载流格式的文件地址 前端用a标签新开窗口或者window open 下载即可 另外一种 后台返回二进制流文件内容 前端通过blob进行转化后再下载 具体代码 async downloadFn t
  • pyautogui.locateOnScreen()扫描屏幕返回none问题

    我们有一张这样的图片 我们想用pyautgui模块的locateOnScreen 定位该图片在屏幕对应的位置 发现屏幕中明明存在改图片 但是扫描失败 找不到该图片 如下两张图 我们给locateOnScreen 括号里添加confidenc
  • Linux——主函数的三个参数,printf方法的隐藏缓冲区

    主函数的三个参数 在windows下 c语言的主函数默认有两个参数 很多人会惊奇 这是什么 好像从没有听说过 我们在写C代码的时候都是习惯性的新建空项目然后自己添加 cpp文件 但是可能有部分人习惯直接新建控制台程序 然后可能就会看到这么一