`
hyshucom
  • 浏览: 811651 次
文章分类
社区版块
存档分类
最新评论

fork函数实例

 
阅读更多

下面是一个fork函数的实例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int     glob = 6;
char buf[] = "a write to stdout\n";

int main(void)
{
        int     var;
        pid_t   pid;

        var = 88;

        if(write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) -1)
                printf("error: write error\n");
        printf("before fork\n");

        if((pid = fork()) < 0) {
                printf("error: fork error\n");
        } else if(pid == 0) {
                glob ++;
                var ++;
        } else {
                sleep(2);
        }

        printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
        exit(0);
}

然后执行输出

jay@jay-vibox:~/workspace/UNIX/8-1$ cc main.c
jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out
a write to stdout
before fork
pid = 2917, glob = 7, var = 89
pid = 2916, glob = 6, var = 88

------------------------------------------------

jay@jay-vibox:~/workspace/UNIX/8-1$ ./a.out > tmp.out
jay@jay-vibox:~/workspace/UNIX/8-1$
jay@jay-vibox:~/workspace/UNIX/8-1$
jay@jay-vibox:~/workspace/UNIX/8-1$ cat tmp.out
a write to stdout
before fork
pid = 2925, glob = 7, var = 89
before fork
pid = 2924, glob = 6, var = 88

-----------------------------------------------------------

一般说来fork之后先执行父进程还是子进程是不确定的。

当写道标准输出时,我们将buf长度减去1作为输出字节数,这是为了避免终止null字符写出。strlen计算不包括终止null字符的字符串长度,而sizeof则计算包括终止null字节的缓冲区长度。两者之间的另一个差别是,使用strlen需进行一次函数调用,而对于sizeof而言,因为缓冲区一用一直字符串进行了初始化,其长度是固定的,所以sizeof在编译时计算缓冲区长度。

当一交互方式运行该程序时,只得到该printf输出的行一次,其原因是标准输出缓冲区由换行符冲洗。

但是当标准输出重定向到一个文件时,却得到printf输出两次。其原因是,当fork之前调用了printf一次,但当调用fork时,该行数据仍在缓冲区中,然后再将父进程数据空间复制到子进程中时,该缓冲区也被复制到子进程中。于是那时父子进程各自有了带改行内容的标准IO缓冲区。

分享到:
评论

相关推荐

    linux下fork函数实例

    用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0

    Linux中fork()函数实例分析

    主要为大家详细介绍了Linux 中fork()函数实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    浅谈Linux环境下并发编程中C语言fork()函数的使用

    fork函数在Linux中可以创建子进程即一个新的进程,这里我们根据实例来浅谈Linux环境下并发编程中C语言fork()函数的使用,需要的朋友可以参考下

    使用C语言的fork()函数在Linux中创建进程的实例讲解

    fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。 fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而园进程称为父进程。使用...

    Linux中使用C语言的fork()函数创建子进程的实例教程

    fork是一个在Linux系统环境下专有的函数,现有的进程调用fork后将会创建一个新的进程,这里我们就来看一下Linux中使用C语言的fork()函数创建子进程的实例教程

    深入解读Linux进程函数fork(),vfork(),execX()

    fork函数:创建一个新进程 1、fork()成功后,将为子进程申请PCB和用户内存空间。 2、子进程会复制父进程用户空间的所有数据(代码段、数据段、BSS、堆、栈),文件描述符。 3、复制父亲进程PCB中绝大多数信息。 4、...

    php中pcntl_fork创建子进程的方法实例

    一、php中pcntl_fork函数概述 pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。 该函数创建子进程具体fork的过程: (1)调用该函数即创建一个子进程,创建成功父进程返回子进程的pid,...

    PHP使用pcntl_fork实现多进程下载图片的方法

    本文实例讲述了PHP使用pcntl_fork实现多进程下载图片的方法。分享给大家供大家参考。具体分析如下: PHP pcntl_fork — 在当前进程当前位置产生分支,子进程,译注:fork是创建了一个子进程,父进程和子进程 都从fork的...

    Python中的进程分支fork和exec详解

    在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新...实例如下: 复制代码 代码如下: #!/usr/bin/python #coding=utf-8 import os def chil

    Android代码-AppUninstall

    Android App监听自身卸载,反馈统计 方案 监听系统卸载广播:只能监听到其他应用的卸载广播,无法监听到自己是否被卸载。...初始化inotify实例 注册监听事件 调用read函数开始监听 卸载反馈统计 场景 正常卸载 断网

    PHP将进程作为守护进程的方法

    意思就是在一个进程组之间(父进程和子进程)调用这个函数的进程会被选举为进程组的leader 所以让一个进程成为守护进程的方法就是: 1 fork出一个子进程 2 在子进程posix_setsid() 3 退出父进程 文档中有这么个例子...

    Python实现多进程的四种方式

    2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0 import os pid=os.fork() if pid==0: print(执行子进程,子进程pid={pid},父进程ppid={ppid}.format(pid=os.getpid(),ppid=os....

    Python实现Linux下守护进程的编写方法

    本文实例讲述了Python...进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同。子进程从父进程继承了多个值的拷贝,比如全局变量和环境变量。两个进程唯一的区别就是fork的返回值。child(子)进

    UNIX环境高级编程_第二版中文

    19.4 pty_fork函数  19.5 pty程序  19.6 使用pty程序  19.7 高级特性  19.8 小结  习题  第20章 数据库函数库  20.1 引言  20.2 历史  20.3 函数库  20.4 实现概述  20.5 集中式或非集中式 ...

    python 进程的几种创建方式详解

    # 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() # 子进程永远返回0,而父进程返回子进程的ID。 if pid == 0: print('子进程') else: print('父进程') 使用Process类类创建 ...

    PHP多进程简单实例小结

    php官网介绍http://php.net/manual/zh/book.pcntl.php,创建子进程需要使用到pcntl_fork(),文档上介绍该函数说 ,pcntl_fork — 在当前进程当前位置产生分支(子进程)。 译注:fork是创建了一个子进程,父进程和子...

    以实例全面讲解PHP中多进程编程的相关函数的使用

    PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。   &lt;?php header('content-type:text/html;charset=utf-8' ); //...

Global site tag (gtag.js) - Google Analytics