精华内容
下载资源
问答
  • fork创建两个子进程
    2022-04-23 11:25:59

    作业内容:

    多线程程序并发设计

           编写程序,利用 fork()产生两个子进程,首先显示一下两个子进程及父进程的进程标
    识符;然后让父进程显示 1-26 个数字,子进程 1 显示 26 个大写字母,子进程 2 显示 26 个
    小写字母。让大小写字母及数字是夹杂交错输出的。修改程序,让两个子进程夹杂输出结束
    后,父进程输出开始

    背景知识

    • 怎么编译线程文件

                因为pthread的库不是linux系统的库,所以在进行编译的时候要加上     -lpthread

           # gcc filename -lpthread  //默认情况下gcc使用c库,要使用额外的库要这样选择使用的库

    gcc thread_create .c -lpthread -o thread_create

    怎么结束一个线程文件:

    ./**.o进入一个线程之后怎么都退出不了,用Ctrl+z/Ctrl+c退出。

    (我又整理了Linux常用命令和快捷键)


    代码实现:

    1.使用三个线程完成1,a,A的交替输出。

    2.在线程中创建子进程。

    更多相关内容
  • fork()函数用于从已存在的进程中创建一个新进程。...这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。实际上是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父
  • fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的...
  • fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。 fork()函数用于从已存在的进程创建一个新进程。新进程称为子进程,而园进程称为父进程。使用...
  • fork创建多个子进程

    千次阅读 2021-05-05 15:42:55
    fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是,子进程的fork返回值是0,父进程的fork返回值是子进程的pid,这也是区分父进程和子进程的方法,至于其他的内容,在fork...

    references:
    [1] how to create two processes from a single Parent
    [2] fork() in C
    [3] linux中fork同时创建多个子进程的方法

    fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是,子进程的fork返回值是0,父进程的fork返回值是子进程的pid,这也是区分父进程和子进程的方法,至于其他的内容,在fork之前的东西两个进程的一样的。

    给出一个父进程和一个子进程的模板

    int fd = fork();
    if(fd < 0){
    	exit(1);
    } else if(fd == 0){
    	// child code
    } else {
    	// father code
    }
    

    对于创建1个父进程和2个子进程,也是一样的道理

    int fd1,fd2;
    
    fd1 = fork();
    if(fd < 0){
    	exit(1);
    } else if(fd == 0){
    	// child1 code
    } else {
    	fd2 = fork();
    	if(fd2 < 0){
    		exit(1);
    	} else if(fd2 == 0){
    		// child2 code
    	} else {
    		// father code
    	}
    }
    

    先创建子进程1,然后父进程再继续执行,创建子进程2,最后,3个进程能够在框架内执行自己的代码。

    这是最好用的框架,能够将3个进程都识别和区分开,不过如果创建n个子进程就会很麻烦。

    因此,根据不同需求,也可以有别的写法

    for(int i = 0; i < n; i++){
    	int fd = fork();
    	if(fd < 0){
    		exit(1);
    	} else if(fd == 0){
    		// child i code
    		break;
    	} else {
    		// father code
    	}
    }
    

    最大作用的是break,保证子进程不会再进一步创建子进程。

    然后其实子进程就可以干自己的事情了,比如执行个exec family,执行其他进程什么的。

    另外值得一说的是,如果父进程没有等待子进程结束之后再结束的话,shell就会出现显示错乱。

    就像下面这样,但是仅仅是显示错乱而已,你可以直接正常输入命令的。
    在这里插入图片描述

    reference
    [1] Using fork() in simplest form need to hit enter to finish execution
    [2] Why do shells call fork()?

    至于为什么,那是因为,当shell执行命令的之后,也会先创建一个子shell,然后执行exec,再执行你想要执行的命令,执行结束后,再返回当前的shell。

    我们用shell执行了父进程,结束后返回,就显示ss@ss:$了,而子进程仍然在执行,并且向shell输出了child process,所以就造成了上面的局面,但是仅仅是显示问题而已,正常向shell输入命令就好。

    展开全文
  • 一、API 头文件:unistd.h pid_t fork(); 作用: 如果fork()调用成功,就会使...根据fork()在父进程和子进程中的返回值不同,程序员可以据此为两个进程指定不同的工作。 二、例子 #include <stdio.h> #include

    一、API

    头文件:unistd.h

    pid_t fork();
    

    作用:
    如果fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用fork()的进程的副本。
    系统调用fork()没有参数,它返回一个pid_t类型的值pid。pid被用来区分父进程和子进程。在父进程中,pid被置为一个非0的正整数;在子进程中,pid被置为0。根据fork()在父进程和子进程中的返回值不同,程序员可以据此为两个进程指定不同的工作。

    二、例子

    #include <stdio.h>
    #include <unistd.h>
    
    int main()
    {
        pid_t pid;
        printf("Now only one process\n");
        printf("Calling fork...\n");
        pid = fork();
        if (!pid)
        {
            printf("I'm the child\n");
        }
        else if (pid > 0)
        {
            printf("I'm the parent, child has pid %d\n", pid);
        }
        else
        {
            printf("fork fail!\n");
        }
    
    
        return 0;
    }
    

    输出结果:

    [root@drxun ch03]# gcc fork.c 
    [root@drxun ch03]# ./a.out 
    Now only one process
    Calling fork...
    I'm the parent, child has pid 87349
    I'm the child
    
    展开全文
  • 代码 #include <... //这里创建第一个进程 pid_t p1=fork(); //如果是父进程,则会跳过这个if语句继续进行下面的语句 //如果是子进程,则会进入这个if语句 if(p1==0){ //子进程执行if语句内容 p

    代码

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    int main(void){
    	printf("before fork(),pid=%d\n",getpid());
    	//这里创建第一个进程
    	pid_t p1=fork();
    	//如果是父进程,则会跳过这个if语句继续进行下面的语句
    	//如果是子进程,则会进入这个if语句
    	if(p1==0){
    	//子进程执行if语句内容
    		printf("child1:\n  pid=%d\n",getpid());
    	//子进程在这里结束,不会继续运行后面语句,从而造成子进程继续创建子进程的问题
    		return 0;
    	} 
    	pid_t p2=fork();
    	if(p2==0){
    		printf("child2:\n  pid=%d\n",getpid());
    		return 0;
    	}
    	int a1,a2;
    	waitpid(p1,&a1,0);
    	waitpid(p2,&a2,0);
    	printf("parent,child2 exited with %d",a2);
    	printf("parent,child1 exited with %d",a1);
    	return 0;
    }
    
    

    运行结果

    在这里插入图片描述

    子进程继续创建子进程的行为

    内容源于:https://www.cnblogs.com/dongguolei/p/8086346.html

    
        /* 
         *  fork_test.c 
         *  version 2 
         *  Created on: 2010-5-29 
         *      Author: wangth 
         */  
        #include <unistd.h>  
        #include <stdio.h>  
        int main(void)  
        {  
           int i=0;  
           printf("i son/pa ppid pid  fpid/n");  
           //ppid指当前进程的父进程pid  
           //pid指当前进程的pid,  
           //fpid指fork返回给当前进程的值  
           for(i=0;i<2;i++){  
               pid_t fpid=fork();  
               if(fpid==0)  
                   printf("%d child  %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
               else  
                   printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);  
           }  
           return 0;  
        }  
    
    
    展开全文
  • fork()创建个进程

    2022-09-09 15:09:17
    【代码】fork()创建个进程
  • fork 循环创建多个子进程

    千次阅读 2020-08-25 10:01:40
    对于仅含有一个 fork()的循环体,循环n次后,共有2^n个进程(包含最初始的父进程); 若fork()在循环体的开端,循环体的代码将被执行 (2^(n+1)-2) 次; 事实上,我们一般只让父进程 fork,不让 子进程 继续fork,...
  • 注:本次学习代码所用编程那个语言为C语言 ...调用fork()函数过后, 系统会创建与原进程几乎相同的进程(感觉就像是将父进程的程序代码复制了一份给子进程),然后父子进程都继续往下执行。 fork()函数调
  • Linux中fork()系统调用创建两个子进程

    万次阅读 多人点赞 2021-04-09 22:53:37
    使用系统调用fork()创建两个子进程: #include <stdio.h> #include <unistd.h> int main(){ int fpid = fork(); if(fpid == 0){ printf("%d I am Child 1. My parent is %d\n",getpid(),getppid())...
  • fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事
  • fork函数:创建进程

    2021-11-09 22:47:39
    fork函数创建子程序原理: 关于fork函数函数几点说明: ...4.调用fork之后父子进程会一起并行执行,由原来一个进程变成两个进程创建子进程代码如下: //fork函数测试 #include<iostream&.
  • 在Linux中创建一个新进程的唯一方法是使用fork函数,fork()执行一次但有两个返回值。在父进程中,返回值是子进程进程号;在子进程中,返回值为0。因此可通过返回值来判断当前进程是父进程还是子进程。使用fork函数...
  • 使用fork()函数创建进程 前言: 如果程序调用fork()成功,fork()函数会返回次的值,次的值都不相同,返回0是给子进程的,父进程返回非负整数。调用不成功返回-1(具体怎样会调用不成功,我现在也不知道,以后学...
  • 补充:1.fork()该函数是用来创建进程的,创建成功会有返回值,返回值大于0代表父进程,等于0代表子进程。 所以上式与或就是在对返回值的判断,而且是有0和非0分别讨论; 2.冷知识:&&(与)的优先级要高于...
  • fork()函数创建进程

    千次阅读 2022-04-07 21:08:11
    fork()用于创建进程,一次调用会有两个返回(return),一次返回给父进程子进程的PID(Process ID),一次返回给子进程,其返回值为0. 返回值=0,子进程在运行 返回值>0,父进程在运行 返回值<0,fo
  • linux中fork函数及子进程进程执行顺序

    千次阅读 多人点赞 2021-09-25 21:55:16
    fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程...
  • Fork同时创建多个子进程方法第一种方法:验证通过特点:同时创建多个子进程,每进程可以执行不同的任务,程序可读性较好,便于分析,易扩展为多个子进程intmain(void){printf("beforefork(),pid=%d\n",getpid())...
  • Linux学习记录,Linux内核编程之进程管理相关知识
  • 可以每接触到多进程编程的人在遇到fork()函数的时候都会由一些疑惑,它怎么能返回次?而且返回值不同。对于以前的认知大家都知道一函数只能返回依次啊。  呵呵,这是fork的神奇所在,它为什么这么神奇?它...
  • fork函数创建进程&僵尸进程&孤儿进程详讲

    千次阅读 多人点赞 2022-03-11 08:45:05
    fork会返回次在父进程中返回一次,在创建的子进程中返回一次。 >0返回给父进程(返回子进程的pid) ==0返回给子进程 创建失败: 返回-1 1.3、fork的原理 子进程拷贝父进程的...
  • 返回值有2个:父进程执行到fork函数,创建了子进程,然后两个进程同时对fork做返回 (1)返回子进程的pid(进程id号,非负正数) -----------父进程 (2)返回0------------------------------------- 子进程 2.ge
  • 上一次说明了进程是怎么被创建的,进程的程序又是如何运行的,本文主要介绍fork()函数创建进程的过程中发生了什么,结合代码进行过程分析
  • 所以可以使用PID来区分两个进程: #!/usr/bin/env python #coding=utf8 from time import sleep import os try: pid = os.fork() except OSError, e: pass sleep(30) 运行代码,查看进程: [root@...
  • 两个进程的父进程ID不同:子进程的父进程ID是创建它的进程的ID、而父进程的父进程ID则不变 子进程的tms_utime、tms_stime、tms_cutime和tms_ustime的值设置为0 子进程不继承父进程设置的文件锁 子进程的未...
  • 创建进程fork——父进程与子进程

    千次阅读 2020-11-02 17:04:42
    fork创建进程 fork系统调用是用于创建进程的,并且fork创建进程初始化状态与父进程一样。(进程空间中的变量)系统会为fork的进程分配新的资源 fork系统调用无参数。 fork返回次,(在父进程中)第一次返回子...
  • 创建守护进程以及为什么fork两

    千次阅读 2017-05-25 13:30:40
    守护进程守护进程也叫精灵进程(Daemon),它在后台运行,独立于控制终端...步骤创建守护进程一般有如下几步: 调用umask(0),将文件模式创建屏蔽改为0 调用fork(),父进程退出,目的是: 父进程终止可以让she
  • Linux进程fork函数创建进程

    千次阅读 2021-10-29 18:30:16
    1.使用fork函数创建一个子进程 需要的头文件及函数原型如下: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 编写代码如下: #include <stdio.h> #include <sys/...
  • fork进程

    2021-06-08 07:38:15
    title: fork进程data: 2019/3/21 20:24:39toc: true这里实在学习socket编程前的小知识点,用来创建服务端学习文档速记fork并不保证父子进程的执行顺序,会存在父进程先比子进程结束,这时候子进程的就可能由...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,380
精华内容 44,152
关键字:

fork创建两个子进程