当前位置:  技术问答>linux和unix

linux C语言中有关'\n'的疑惑!

    来源: 互联网  发布时间:2016-10-06

    本文导语:  进程的创建:  题目:编写一个程序,输入两个整数并求和输出,然后创建一个子进程,当进程调度程序调度到父进程或子进程时特输出不同的信息。(父进程输出:I am  father process! My Id=进程号; 子进程输出:I am  son p...

进程的创建:
 题目:编写一个程序,输入两个整数并求和输出,然后创建一个子进程,当进程调度程序调度到父进程或子进程时特输出不同的信息。(父进程输出:I am  father process! My Id=进程号; 子进程输出:I am  son process ! my  id=***)
代码如下:
(1)
//test1.c
#include
int  main()
{
   int m = 5 , n = 15;
   int pid_t;
   printf("The Sum of m and n is:%dn",m + n);  pid_t = fork();
 if(pid_t == 0)
{
printf("I am son process ! My process id = %dn",getpid());
}
else
{
      printf("I am father process ! My id = %dn",getpid());
}
  return 0;
}
编译程序test1.c并运行后得到运行结果:
[u2342010345@localhost u2342010345]$ gcc -o test1 test1.c
[u2342010345@localhost u2342010345]$ ./test1
The Sum of m and n is:20
I am son process ! My process id = 4223
I am father process ! My id = 4222

我的问题是,为什么我将红体字部分改为printf("The Sum of m and n is:%d",m + n);
即将printf函数当中的'n'去掉之后为什么改语句执行了两次?
即运行结果为:
[u2342010345@localhost u2342010345]$ gcc -o test1 test1.c
[u2342010345@localhost u2342010345]$ ./test1
The Sum of m and n is:20I am son process ! My process id = 4554
The Sum of m and n is:20I am father process ! My id = 4553

确实不是很明白为什么会出现这样奇怪的结果,按道理
用fork函数创建子进程时,之前的语句不会再子进程中存在的。

|
printf并没有执行两次,问题在于它的缓冲机制。
printf的内容先输出到缓冲区,程序继续执行,然后系统选择一个合适的时机把缓冲区里的内容打印到屏幕,这样可以提高程序执行的效率。
fork的时候子进程要从父进程复制很多数据,缓冲区内容也在其中。
所以,区别就在于,fork的时候缓冲区的内容是否已经到了屏幕。如果还没有,那么缓冲区里的内容就会从父进程和子进程各自打印一次到屏幕。
n的作用就是清空缓冲区把所有内容打印到屏幕上。

|
如果去掉n
printf("The Sum of m and n is:%d",m + n); 
fflush(stdout); // 强制清空缓冲区
pid_t = fork();
这样也只输出一次

|
printf的缓冲有时候还会带来其他问题。比如:
void f() {}
int main()
{
    printf("AAAn");
    f();
    printf("BBB");
    *(int*)0 = 0;
}
我运行的结果只有AAA, 没有BBB。这是因为它还没来得及从缓冲区输出,程序就挂了。
如果调程序的时候遇到这种情况,就很可能是错误的怀疑是死在了函数f()里面。

|
没有加n的时候 The Sum of m and n is:20在缓冲里面没输出,
fork的时候子进程拷贝了父进程的数据,所以父子进程的缓冲里面
都有The Sum of m and n is:20,在各自打印的时候就变成你的样子了

|
fork后子进程会保留父进程的缓冲区;
标准输出默认是行缓冲,有两种情况会冲洗缓冲区并把数据输出到设备:1,当缓冲区满时,2,当遇到'n'字符时。
可以用下面的代码试一下


int main(void)
{
   printf("Hello World!");
   while(1);
   return 0;
}


#include 

int main(void)
{
  printf("Hellon");
  printf("World");
  while(1);
  return 0;
}

但当打印的字符串足够长时(充满缓冲区),字符串还是会被打印出来的。

|
参见APUE 172页

|
介绍得比较专业!

    
 
 

您可能感兴趣的文章:

  • 关于学linux的一点疑惑
  • 疑惑:应该使用那种Linux?
  • 新手学习linux 有些疑惑
  • 一个关于linux源代码的疑惑
  • 关于Linux的各种疑惑,请各位赐教,谢谢
  • Linux 动态库,静态库的一些疑惑
  • 关于linux根文件系统的疑惑
  • linux内核安装问题 , 有点疑惑~
  • linux原子操作的疑惑
  • linux和c的一些疑惑!
  • 对 Linux 的疑惑
  • Linux网络编程的疑惑
  • 关于linux中用户,目录的切换的疑惑?
  • linux fork()函数的疑惑
  • 关于LINUX时间的一个疑惑
  • Linux动态链接的疑惑
  • 疑惑softfloat的问题,并求arm-linux-gcc和arm-linux-softfloat-gcc4.1.1
  • 关于linux c,c++编程的疑惑
  • Linux菜鸟的疑惑
  • 接触Linux,有几点疑惑的地方请教一下~~~
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • LINUX 或者Windows 如何保证一个进程只有一个实例在运行?如果是C语言,JAVA语言开发,又怎么样保证?
  • LINUX下面C语言和C++语言所开发的软件有什么区别
  • 有了c语言基础,如何入手学习用c语言linux网络编程
  • 操作系统 iis7站长之家
  • 一个小问题。Linux下编程语言的问题。
  • 我是一个linux新手,不知道如何在linux进行C语言的编写和使用?
  • LINUX下语言的困惑(超菜)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • 我想看看有关Linux和Unix的源码,有什么好的建议
  • 有关linux的问题
  • linux的有关问题!
  • 有关LINUX编程的书籍
  • 有关Redhat Linux的版本问题
  • 有关配置红旗LINUX网络的问题,
  • 有关linux的lilo的问题
  • 有关linux7.3的启动
  • 有关linux下编成问题
  • 请问ftp上传大小写突然改变跟linux有关吗?
  • 新手有关linux的问题!
  • 有关linux平台的嵌入式开发工具
  • 有关Linux和Unix下命令安装位置
  • 有关关闭机器的问题LINUX
  • 有关Linux8.0一个小问题!
  • 有关win2000和redhat8.0 linux的时间问题
  • 有关linux的安装问题
  • 有关linux下MySql的安装和使用
  • 请问哪有有关linux/unix操作手册sch的文档下载吗?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3