linux成为init子进程,Linux fork创建子进程
发布日期:2021-10-27 15:17:57 浏览次数:15 分类:技术文章

本文共 4185 字,大约阅读时间需要 13 分钟。

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

{

perror("fork fail : ");

exit();

}

else if(pid == ) //在子进程中:返回值为0

{

printf("child\n");

printf("child getpid() %d \n",getpid());

printf("child getppid() %d \n",getppid());

exit();

}

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 ;

}

测试:

69b6f0268a314857c631ae0bc0f39ac5.png

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

利用fork创建子进程

创建如图的进程: #include #include #include #include

2.1 进程控制之fork创建子进程

fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...

线程_互斥锁_Lock及fork创建子进程

""" 创建锁 mutex = threading.Lock() 锁定 mutex.acquire([blocking]) 当blocking为True时,当前线程会阻塞 ...

Python 使用 os.fork() 创建子进程

Linux 操作系统提供了一个 fork() 函数用来创建子进程,这个函数很特殊,调用一次,返回两次,因为操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回.子进程永 ...

fork()创建子进程

fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid) 在fork()的调用处,整个父 ...

Linux下利用fork()创建子进程并使父进程等待子进程结束

int status; pid_t t = fork(); if(t){     waitpid(t, &status, 0); }else{     system("vi temp ...

windows、linux创建子进程

在windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程: STARTUPINFO si = {0};                 PROCES ...

linux中fork创建进程讲解(转)

大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难.我们举个例子来看看fork的用法吧.         大家用fork的时候记住fork是 ...

exec族函数详解及循环创建子进程

前言:之前也知道exec族函数,但没有完全掌握,昨天又重新学习了一遍,基本完全掌握了,还有一些父子进程和循环创建子进程的问题,还要介绍一下环境变量,今天分享一下. 一.环境变量 先介绍下环境的概念和特 ...

随机推荐

ubuntu 下截图与快捷键设置

1. 安装 这里使用的 kubuntu sudo apt-get install ksnapshot 2. 设置快捷键 点击左下角的开始菜单,选择`应用程序` `设置` `系统设置` ksnapsho ...

0011 SDK测试方法&ADB语法

h1.移动云OSS SDK测试方法,包含环境搭建 android  oss sdk 测试方法 1.          搭建测试环境 1.     A ndroid模拟器需要jdk1.6 2.      ...

Python3基础 print与,结合 一次输出多个数据

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

socket发送和接收数据

1)sendBuf(),sendText(),sendStream() 几乎所有的通信控件都会提供上面的3个方法.首先看看SendBuf(). function TCustomWinSocket.Se ...

苹果手表的真实触感信息(Real Touch Messaging)

苹果手表凭借其炫酷的设计和界面,无疑已成为一个新的科技焦点,也是苹果在可穿戴领域的重头戏. Apple Watch 有一个非常吸引人的特性:Real Touch Messaging,也就是真实触感消息 ...

Oracle数据csv导入

打开工具,在tool下面有个Text Importer 先选择Data from textfile选项卡 然后选择 Open data file ,打开要导入的文件 1\ 2\ 再先选择Data to ...

震撼:多线程下的操作离不开synchronized

昨天在写一个聊天程序,在发送消息的时候是采用单独的一个线程,接收消息是在另一个线程中完成. 我在测试的过程中发现,有的时候当消息比较多时,比如: 当我刚刚发送完一条消息,这个时候要将我发送的消息添加到 ...

C_求两个日期相隔的天数(闰年)

#include #include int leap_year(int year){ == || (year%== && ...

Linux服务器同步Intetnet时间

Linux服务器同步Intetnet时间 在使用linux服务器(虚拟机)的过程中,经常会发现使用一段时间后,linux服务器的时间和我的宿主机的时间不一致,而宿主机的时间确实是internet时间, ...

转载地址:https://blog.csdn.net/weixin_35172279/article/details/116557523 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux将文件内容全角转半角,文本处理(一)全角转半角及正则匹配
下一篇:linux把根目录下0Apr删除,Linux下恢复数据误删除

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月08日 12时26分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章