子进程和父进程关系以及缓冲区应用

int main()
{
printf("abc\n");
pid_t r = fork();//子进程从fork()的下条语句开始运行,标准答案是从fork的后半部分开始运行
if(r==0)
{
printf("getpid = %d\n",getpid());
printf("getppid = %d\n",getppid());

}

if(r>0)
{
printf("r = %d\n",r);
printf("getpid = %d\n",getpid());
printf("getppid = %d\n",getppid());

}
if(r==-1)
{
printf("error!\n");
}
printf("123\n");

./getpid > 1.txt
1.txt:
abc
r = 2925
getpid = 2924
getppid = 2349
123
abc
getpid = 2925
getppid = 1
123

./getpid
abc
r = 2922 创建的子进程的pid
getpid = 2921 当前进程的pid
getppid = 2349当前进程父进程的pid
123

[email protected]:~/shared$ getpid = 2922当前进程的pid
getppid = 1 //init进程号,父进程死了找了一个继父init,如果用else if else,结果会不一样。
123

为什么1.txt多个abc?
因为文本为全缓冲,而屏幕为行缓冲,当将执行程序的结果直接输出到屏幕时,遇到‘\n’,将结果

强制刷新,输出到屏幕,然后将内容清空,所以父进程拷贝到子进程的代码中不含有abc,
但输出到文本不一样,文本为全缓冲,系统会将代码全缓冲到一个缓冲区中,父进程执行代码printf

("abc\n")后,并不会将其清空,而是将其存放到缓冲区,并copy到子进程,然后子进程运行后就会再次输出

abc。

时间: 2024-08-03 19:02:04

子进程和父进程关系以及缓冲区应用的相关文章

linux的fork()函数具体解释 子进程复制父进程什么

#include<stdio.h>?? #include<string.h>?? #include<stdlib.h>?? #include<unistd.h>?? ?? void?main()?? {?? ????char?str[6]="hello";?? ?? ????pid_t?pid=fork();?? ?? ????if(pid==0)?? ????{?? ????????str[0]='b';?? ????????print

pstree-显示子进程的父进程

安装pstree:yum install psmisc -y 作用:用于追踪子进程的父进程 使用场景:需要知道某个子进程的父进程时: 常用选项: -a:显示命令行选项(即显示启动进程所使用的命令) -p:打印出父进程的pid号 -s:显示子进程所有的父进程(默认只显示子进程的第一个父进程) 注:aps常组合在一起使用 用法示例: 只显示某个进程的父进程 [[email protected] ~]# pstree 1004 qmgr 显示出父进程并且同时显示父进程的pid [[email prot

子进程继承父进程中互斥锁的讨论

季 收酩 ≤坻 溲凯 狯趟 败妊 案滠 勇醵 鲺+ 蜉 ㄚ觌 σ铢 蕹黉 痫 Л葜 奥雄 舅蚁 ┗ 壑鲑 |蟊 殒跖 瑚阏 蹂渖 祢さ 焚逋 铬疮 每掐 镛翥 ㄗ弓 馑 Х哮 弁嫘 邛疸 馁 钝妃 孤茄 篝疠 凄ㄦ 埭嗯 绐 储 Р营 チ裢 旆存 雷 髀 も耩 订晾 冈 瞀眷 氮毗 腐薜 湄猸 窝起 逝皋 谨裰 嗪壬 椽誊 斩鲢 助耵 沾稷 脍栾 山跬 乓 觉理 准 Т 莉蠹 很坂 鞘犁 腕剽 逊雀 愕 伞 筘碥 巴另 ㄣ筷 译坫 腙 哉茚 鲜菊 崤 猡 跣

父进程结束,其子进程不会结束,会挂到init进程下

结论:一个父进程产生子进程,父进程结束(kill),子进程不会结束,子进程被init进程托管 下面是过程: d.sh脚本是一个ping命令,执行d.sh 目前,103310 进程为父进程,103344为子进程 现在把父进程kill掉. 最终发现,子进程103344被托管到1进程下. 参考: 孤儿进程与僵尸进程[总结] 原文地址:https://www.cnblogs.com/sdadx/p/10133168.html

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

父子进程关系

1)父进程先于子进程终止: 此种情况就是我们前面所用的孤儿进程.当父进程先退出时,系统会让init进程接管子进程 . 2)子进程先于父进程终止,而父进程又没有调用wait或waitpid函数 此种情况子进程进入僵死状态,并且会一直保持下去直到系统重启.子进程处于僵死状态时,内核只保存进程的一些必要信息以备父进程所需.此时子进程始终占有着资源,同时也减少了系统可以创建的最大进程数. 僵死状态:一个已经终止.但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占有的资源)的进程被称为

进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端

摘要:本文主要介绍进程的基本属性,基本属性包括:进程ID.父进程ID.进程组ID.会话和控制终端. 进程基本属性 1.进程ID(PID) 函数定义: #include <sys/types.h> #include <unistd.h> pid_t getpid(void); 函数说明: 每个进程都有一个非负整型表示的唯一进程ID(PID).好比如我们的身份证一样,每个人的身份证号是唯一的.因为进程ID标示符总是唯一的,常将其用来做其他标示符的一部分以保证其唯一性,进程ID(PID)

父进程文件句柄被子进程占用

场景描述:1.父进程A使用函数fopen打开(创建)一个磁盘文件file.exe.tmp2.父进程进行长时间的边下载边写入3.下载写入完成后,使用fclose关闭文件句柄4.重命名file.exe.tmp为file.exe 以上为理想情况下的代码执行流程. 问题:在第四步,重命名文件有可能失败,使用 GetLastError 函数发现失败原因为 此文件被另外一个进程占用. 解决:1.使用微软官方开发的handle.exe来查找是哪个进程占用了这个文件(handle.exe的下载地址  https

Unix环境高级编程(八)进程关系

本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候好好总结一下. 1.终端登录 介绍了有终端登录Unix系统的过程.通过init进程读文件/etc/ttys,fork一个子进程调用exec执行getty程序进行登录,当用户输入完用户名后,getty的工作完成了,然后调用login程序,类似execle("/bin/login","