文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用Linux fork创建子进程

2023-06-28 08:12

关注

今天小编给大家分享一下怎么用Linux fork创建子进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

怎么用Linux fork创建子进程

1. pid_t fork(void);   

功能:创建父子进程   

参数:无   

返回值:成功:在父进程中:返回值为子进程的PID     

在子进程中:返回值为0     失败:-1 注意:   

1)fork函数是用来创建进程的,fork之后产生了两个进程,每个进程都会有返回值,     所以父进程中返回的是子进程的进程号(>0);在子进程中返回0

2)子进程几乎拷贝了父进程的全部内容。      包括代码、数据、系统数据段中的pc值、栈中的数据、父进程中打开的文件等;但它们的PID、PPID是不同的。

3)父子进程有独立的地址空间,互不影响;当在相应的进程中改变全局变量静态变量,都互不影响。

4)若父进程先结束,子进程成为孤儿进程被init进程收养(此时子进程的父亲就是init),子进程变成后台进程。(init进程号为1)

5)若子进程先结束,父进程如果没有及时回收,子进程变成僵尸进程(要避免僵尸进程产生)

2.  pid_t getpid(void); 

功能:得到正在调用此接口的进程的进程号 

返回值:得到PID号

3.  pid_t getppid(void); 

功能:得到正在调用此接口的进程的父进程号 

返回值:得到PID

4. pid_t wait(int *status) 头文件

功能:阻塞等待任意子进程的结束,回收资源 status是一个整型指针,指向的对象用来保存子进程退出时的状态。 status若为空,表示忽略子进程退出时的状态 status若不为空,表示保存子进程退出时的状态 另外,子进程的结束状态可由Linux中一些特定的宏来测定。

5. pid_t waitpid(pid_t pid, int *status, int options) 

功能:等待子进程的结束,回收资源 

参数:   

(1)pid: pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。 pid=-1:等待任何一个子进程退出,此时和wait作用一样。   

(2)status:同wait   

(3)options:WNOHANG:不阻塞,返回 0(没有接受到),pid号(成功接收到) 0:同wait,阻塞父进程,等待子进程退出。失败 -1 ,成功 pid号 返回值: 正常:结束的子进程的进程号,使用选项WNOHANG且没有子进程结束时:0 出错:-1 等价:wait(NULL) == waitpid(-1, NULL, 0)   WEXITSTATUS(status)

6. void exit(int status); 功能:结束正在调用的进程,程序结束前,会清理缓存区

7. _exit:void _exit(int status); 功能:结束正在调用的进程,程序结束前不清理缓存区 注意: status是一个整型的参数,可以利用这个参数传递进程结束时的状态。 通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。 在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的处理。 exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统; 而return 是退出当前函数,返回函数值,把控制权交给调用函数。

fork创建子进程例子:

 #include #include #include #include #include  int main(int argc, const char *argv[]) {     pid_t pid;     pid = fork();     if(pid == -1)//失败返回 -1     {         perror("fork fail : ");         exit(1);     }     else if(pid == 0) //在子进程中:返回值为0     {         printf("child\n");         printf("child getpid() %d \n",getpid());         printf("child getppid() %d \n",getppid());         exit(1);     }     else //在父进程中:返回值为子进程的PID     {         int s;         wait(&s);         printf("fork\n");         printf("father pid %d\n",pid);//子进程pid         printf("father getpid() %d \n",getpid()); //父进程pid         printf("father getppid() %d \n",getppid());//父进程的父进程的pid         printf("father %d\n",WEXITSTATUS(s));         perror((char*)&s);     }     return 0; }

测试:

怎么用Linux fork创建子进程

子进程会复制父进程的全部内容,出来pid号和ppid号,但是子进程程序执行从 fork 函数之后执行的

以上就是“怎么用Linux fork创建子进程”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯