fork函数 && IO缓冲区

简介: NULL /*** wobuxiangyaozhaiyao ***/

一、fork()函数

头文件 :#include 或 #include
函数原型:pid_t fork( void);
返回值 :成功(子进程为0,父进程为子进程PID)
     失败(-1)

NOTE:(1)fork()父进程和子进程的执行顺序不确定,取决于系统的实现
   (2)子进程复制数据、堆、栈,但代码段共享



二、printf缓存

printf引起的缓存机制问题:(Linux的缓冲区)
  全缓冲区:普通磁盘文件使用。缓冲区满、刷新函数fflush((FILE *stream))执行IO操作
  行缓冲区:终端使用。缓冲区满、换行符、刷新函数执行IO操作
  非缓冲区:标准出错流stderr

缓冲区刷新机制:
  1、使用fflush(stdout)强制刷新标准输出缓冲区。
  2、缓冲区已满。
  3、scanf()要在缓冲区里取数据时会先将缓冲区刷新。
  4、换行符n进入缓冲区时。(注意:用换行符刷新缓冲区可能会出现问题,下面会解释)
  5.、程序结束时。



三、代码示例

/************************************************************/
代码:(printf没有"\n")
int main()
{
    pid_t forkPid = -1;

    printf("*** This is fork() before! ***\n");
    forkPid = fork();
    if(-1 == forkPid)
    {
        printf("### fork() return ERROR ###\n");
        return -1;
    }
    printf("PID: %d    fork_PID: %d \n", getpid() ,forkPid);

    return 0;
}

输出:
*** This is fork() before! ***PID: 2715    fork_PID: 2716 
*** This is fork() before! ***PID: 2716    fork_PID: 0 
/************************************************************/


/************************************************************/
代码:
int main()
{
    pid_t forkPid = -1;

    printf("*** This is fork() before! ***\n");
    forkPid = fork();
    if(-1 == forkPid)
    {
        printf("### fork() return ERROR ###\n");
        return -1;
    }
    printf("PID: %d    fork_PID: %d \n", getpid() ,forkPid);

    return 0;
}

输出:
*** This is fork() before! ***
PID: 2700    fork_PID: 2701 
PID: 2701    fork_PID: 0 
/************************************************************/


/************************************************************/
[root@localhost xhuan]# ./tmp > tmp_output.txt
[root@localhost xhuan]# 
[root@localhost xhuan]# cat ./tmp_output.txt 
*** This is fork() before! ***
PID: 2846    fork_PID: 2847 
*** This is fork() before! ***
PID: 2847    fork_PID: 0 
/************************************************************/
目录
相关文章
|
6月前
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
992 0
|
3月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
29 0
|
4月前
|
Linux 编译器 C语言
【Linux】基础IO----理解缓冲区
【Linux】基础IO----理解缓冲区
60 0
【Linux】基础IO----理解缓冲区
|
4月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
6月前
|
人工智能 数据挖掘 Python
Python pandas中read_csv函数的io参数
Python pandas中read_csv函数的io参数
69 5
|
6月前
|
存储 编译器 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
46 0
|
6月前
|
C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(中)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
67 0
|
6月前
|
存储 数据库 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(上)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
49 0
|
6月前
|
Linux
Linux io多块读写readv函数和writev函数
fd参数是被操作的目标文件描述符。iov参数的类型是iovec结构数组,该结构体描述一块内存区。iovcnt参数是iov数组的长度,即有多少块内存数据需要从fd读出或写到fd。readv和writev在成功时返回读出/写入fd的字节数,失败则返回-1并设置errno。readv函数将数据从文件描述符读到分散的内存块中,即分散读;writev函数则将多块分散的内存数据一并写入文件描述符中,即集中写。
57 0
|
6月前
|
Linux
Linux网络编程(多路IO复用select函数使用)
Linux网络编程(多路IO复用select函数使用)
71 0