linux fork()函数学习

转载 2007年09月18日 11:08:00
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
    pid_t pid;
    static int n = 0;
    printf("fork!/n"); /*printf("fork!")*/
    switch (pid = fork())
    {
        case -1:
        {
            /* 这里pid为-1,fork函数失败 */
            /* 一些可能的原因是 */
            /* 进程数或虚拟内存用尽 */
            perror("The fork failed!");
            break;
        }
        case 0:
        {
            /* pid为0,子进程 */
            printf("[child]i am child!/n");
            printf("[child]getpid=[%d]/n", getpid() );
            printf("[child]pid=[%d]/n", pid );
            break;
        }
        default:
        {
            /* pid大于0,父进程 */
            printf("[parent]i am parent!/n" );
            printf("[parent]getpid=[%d]/n",getpid() );
            printf("[parent]pid=[%d]/n",pid );
            break;
        }
    }
    printf("n=[%d]/n", n++);

    return 0;
}

输出结果1
fork!
[child]i am child!
[parent]i am parent!
[parent]getpid=[4496]
[parent]pid=[4497]
n=[0]
[child]getpid=[4497]
[child]pid=[0]
n=[0]
输出结果2
fork![child]i am child!
[child]getpid=[4794]
fork![parent]i am parent!
[parent]getpid=[4793]
[parent]pid=[4794]
n=[0]
[child]pid=[0]
n=[0]

如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,getpid()返回的才是各自真是的进程号。

printf("fork!");//print 一次;   这里会print 2次
如果将 printf("fork!") 换成 printf("fork!/n")   那么就是只打印一次了.
主要的区别是因为有了一个 /n  回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 /n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf("
fork!") 后,fork!仅仅被放到了缓冲里,再运行到fork时,缓冲里面的fork!被子进程继承了
因此在子进程度stdout缓冲里面就也有了
fork!.
所以,你最终看到的会是
fork!被printf了2次!!!!
而运行 printf("
fork!/n")后,fork!被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!! 
 
 

相关文章推荐

linux 系统编程-学习笔记7-进程/fork/vfork/exec函数族

u-boot ==>Image ==>根文件系统==>init进程(1) ==>exec执行进程==>启动代码==>main{ ==>传入环境变量 exit/return ==>1)刷新...

linux学习之十---vfork()&fork()函数

vfork()也可以用来创建一个新进程,与fork()函数一样都是调用一次,返回两次,但它有自己的独特之处,区别如下: 1.使用fork创建一个子进程,子进程完全复制父进程的资源,这样得到的子进...

linux_fork函数

  • 2013-07-01 23:47
  • 562KB
  • 下载

Linux中fork()函数详解

linux中fork()函数详解(原创!!实例讲解) (转载)    一、fork入门知识      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原...

Linux中fork函数分析

1、fork简介 一个进程,是包括代码、数据和分配给进程的资源,fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就两个进程可以完全做相同的事,但如果初始化参数或者传入的变量不同,...

深入理解Linux的fork函数

一、问题引入     工作期间,某系统设计师抛出如下一个问题,下面的代码,输出几个“-”?: [cpp] view plaincopyprint? /*******************...

linux下fork函数创建进程

有3个进程,其中一个为父进程,其余两个是该父进程创建的子进程,其中一个子进程运行“ls -l”指令,另一个子进程在暂停5s后异常退出。父进程先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一...

linux中fork()函数详解(转载!!实例讲解)

转载地址:http://blog.csdn.net/jason314/article/details/5640969

linux中fork函数及子进程父进程进程先后

一、fork入门知识      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者...
  • wu_zf
  • wu_zf
  • 2012-06-07 10:32
  • 14563

linux系统编程之进程(二):fork函数相关总结

一、fork系统调用 包含头文件 和 函数功能:创建一个子进程 函数原型          pid_t  fork(void); 参数:无参数。 返回值: 如果成功创建一个子进程,对于父进程来说返...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)