【Linux】主函数的参数和输出缓冲区的问题

一、主函数(main函数)的参数
1、参数类型
当我们在c语言中使用main函数的时候,系统会给我们生成这样一个方法:

int main(int argc, char* argv[], char* envp[]);

这三个参数的含义
(1)argc:int类型。指的是传递给main方法的参数列表中的参数个数
(2)argv:指针数组类型(char*) []。传递给main()方法的参数列表。
(3)envp:指针数组类型 (char*)[]。传递的环境变量列表。
2、如何使用
我们先在linux创建一个文件main.c。里面写的内容如下:

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

我们在linux上运行,编译完成后,我们现在不传递任何参数,只是一个最基本的执行。得到如下图所示:
在这里插入图片描述
发现,不传参程序会默认有一个参数。只要用户执行程序,mian方法默认至少接收一个参数,此参数就是执行程序的命令。
当我们传递参数时,先执行命令:

./main hello world

结果如下图所示:
在这里插入图片描述
这里显示的是传递的参数个数三个。分别是:./main、hello、world。
现在我们执行命令:./main "hello world"时。结果如下:
在这里插入图片描述
这是因为双引号将hello world构成了一个字符串,所以传递的参数是两个。
二、输出缓冲区
我们在linux上先创建一个文件print.c,在里面写的代码如下:

int main()
{
	printf("hello");//1
	sleep(5);//2
	printf("world\n");//3
	exit(0);
}

我们发现这个程序的输出结果是:先是睡眠了5秒钟,然后输出了hello world。而不是先输出hello,然后睡眠了5秒,然后输出world。结果如下图所示:
在这里插入图片描述
这其实是一个输出缓冲区的问题。跟我们的语言无关,而是线程的问题。
当我们执行这个代码时,它是按照顺序执行,先执行第一句再执行第二句然后执行第三句。
但它执行第一句的printf的时候并不是很快将它打印出来。而是将hello写入输出缓冲区(内存上的一块空间)。
再去执行sleep睡眠5秒钟
然后执行第三句的printf。和第一句一样,将world和\n写入到输出缓冲区。

但是最后打印出来的hello world打印到界面上,它是如何打印的呢?所以我们就需要了解缓冲区输出到界面上的条件。
(1)"\n”
(2)手动刷新 fflush(stdout)
(3)缓冲区满
(4)进程结束
我们重点看一下第一个“\n”的问题。
先将上述的代码改一下,我们再第三句的printf后再加一个睡眠两秒钟,那么会出现什么情况呢

int main()
{
	printf("hello");//1
	sleep(5);//2
	printf("world\n");//3
	sleep(2);
	exit(0);
}

如下图所示:
在这里插入图片描述

我们发现程序先是睡眠了5秒钟,然后打印出来hello world然后再睡眠了两秒钟。
我们再将上述代码改成一下,在第一句的hello后面加上\n

int main()
{
	printf("hello\n");//1
	sleep(5);//2
	printf("world\n");//3
	sleep(2);
	exit(0);
}

结果如下图所示:
在这里插入图片描述

我们发现程序先是打印出来了hello。然后睡眠了5秒钟。再是打印出来了world。最后睡眠了两秒钟。
通过以上两个例子,我们可以清楚得看出“\n”是缓冲区输出到界面上的重要条件之一。
以上就是主函数参数和输出缓冲区的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值