Linux--主函数的三个参数(环境变量)、printf隐藏的缓冲区(目的、存在感、强制刷新、退出)

2023-11-12

目录

1.主函数的前两个参数

​编辑

2.环境变量

3.envp,argv都是以NULL作为结尾的

4.printf隐藏的缓冲区

(1)目的

(2)环境变量

(3)缓冲区的存在

(4)强制刷新

(5)_exit与exit


1.主函数的前两个参数

argc argv envp main

shell 壳

#include<stdio.h>

int main(int argc,char*argv[],char*envp[])
{
    int i=0;
    printf("argc=%d\n",argc);
    
    //for(;i<argc;i++)
    //{
      //  printf("argv[%d]=%s\n",i,argv[i]);
    //}
    for(;argv[i]!=NULL;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);
    }
    
    for(i=0;envp[i]!=NULL;i++)
    {
        printf(envp[%d]=%s\n",i,envp[i]);
    }
               
     return 0;
}

argc:个数

argv:数组内容

envp:环境变量

envp、argv都是以NULL作为结尾

2.环境变量

envp是由父进程继承过来的参数;

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;

for(i=0;envp[i]!=NULL;i++)
{
    printf(envp[%d]=%s\n",i,envp[i]);
}

3.envp,argv都是以NULL作为结尾的

for(;argv[i]!=NULL;i++)
    {
        printf("argv[%d]=%s\n",i,argv[i]);
    }

4.printf隐藏的缓冲区

(1)目的

1.提高效率;

2.用户态切换到内核态;(有缓冲区,减少切换次数)

3.开销比较大

用户:在用户态

打印:在内核

(2)演示缓冲区没有存在感

#include <stdio.h> 
int main() 
{ 
    printf("hello");
}

(3)缓冲区的存在

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
int main() 
{ 
	printf("hello"); 
	sleep(3);
	exit(0); 
}

(4)强制刷新

(1)方法一:遇到\n自动刷新

(2)使用fflush刷新屏幕

fflush(stdout);

(5)_exit与exit

_exit与exit

exit是先刷新缓冲区,然后再调用_exit(真正的退出)

_exit:直接退出,不会刷新缓冲区

(6)总结

printf:将内容先写到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:

(1)缓冲区放满

(2)缓冲区未满,强制刷新缓冲区到屏幕(\n或者fflush(stdout))

(3)程序结束时,自动刷新缓冲区,exit方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--主函数的三个参数(环境变量)、printf隐藏的缓冲区(目的、存在感、强制刷新、退出) 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐