下面是一个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缓冲区。
分享到:
相关推荐
用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0
主要为大家详细介绍了Linux 中fork()函数实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
fork函数在Linux中可以创建子进程即一个新的进程,这里我们根据实例来浅谈Linux环境下并发编程中C语言fork()函数的使用,需要的朋友可以参考下
fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。 fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而园进程称为父进程。使用...
fork是一个在Linux系统环境下专有的函数,现有的进程调用fork后将会创建一个新的进程,这里我们就来看一下Linux中使用C语言的fork()函数创建子进程的实例教程
fork函数:创建一个新进程 1、fork()成功后,将为子进程申请PCB和用户内存空间。 2、子进程会复制父进程用户空间的所有数据(代码段、数据段、BSS、堆、栈),文件描述符。 3、复制父亲进程PCB中绝大多数信息。 4、...
一、php中pcntl_fork函数概述 pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。 该函数创建子进程具体fork的过程: (1)调用该函数即创建一个子进程,创建成功父进程返回子进程的pid,...
本文实例讲述了PHP使用pcntl_fork实现多进程下载图片的方法。分享给大家供大家参考。具体分析如下: PHP pcntl_fork — 在当前进程当前位置产生分支,子进程,译注:fork是创建了一个子进程,父进程和子进程 都从fork的...
在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新...实例如下: 复制代码 代码如下: #!/usr/bin/python #coding=utf-8 import os def chil
Android App监听自身卸载,反馈统计 方案 监听系统卸载广播:只能监听到其他应用的卸载广播,无法监听到自己是否被卸载。...初始化inotify实例 注册监听事件 调用read函数开始监听 卸载反馈统计 场景 正常卸载 断网
意思就是在一个进程组之间(父进程和子进程)调用这个函数的进程会被选举为进程组的leader 所以让一个进程成为守护进程的方法就是: 1 fork出一个子进程 2 在子进程posix_setsid() 3 退出父进程 文档中有这么个例子...
2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0 import os pid=os.fork() if pid==0: print(执行子进程,子进程pid={pid},父进程ppid={ppid}.format(pid=os.getpid(),ppid=os....
本文实例讲述了Python...进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同。子进程从父进程继承了多个值的拷贝,比如全局变量和环境变量。两个进程唯一的区别就是fork的返回值。child(子)进
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 集中式或非集中式 ...
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid = os.fork() # 子进程永远返回0,而父进程返回子进程的ID。 if pid == 0: print('子进程') else: print('父进程') 使用Process类类创建 ...
php官网介绍http://php.net/manual/zh/book.pcntl.php,创建子进程需要使用到pcntl_fork(),文档上介绍该函数说 ,pcntl_fork — 在当前进程当前位置产生分支(子进程)。 译注:fork是创建了一个子进程,父进程和子...
PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。 <?php header('content-type:text/html;charset=utf-8' ); //...