Linux中fork函数作用,深入解析Linux中的fork函数

Linux中fork函数作用,深入解析Linux中的fork函数1、定义#include#includepid_tfork(void);pid_t是一个宏定义,其实质是int,被定义在#include中返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-12、函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(childprocess)。fork函数被调用一次但返回两次。…

1、定义

#include

#include

pid_t fork( void );

pid_t 是一个宏定义,其实质是int,被定义在#include中

返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

2、函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。File locks and pending signals are not inherited. 【3】

If the call to fork() is executed successfully, Unix will

① make two identical copies of address spaces, one for the parent and the other for the child.

② Both processes will start their execution at the next statement following the fork() call.

3、为什么fork会返回两次?

由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因为fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

After a new child process is created, both processes will execute the next instruction following the fork() system call.

调用fork之后,代码有两份,都从fork函数中返回。

Please note that Unix will make an exact copy of the parent’s address space and give it to the child. Therefore, the parent and child processes have separate address spaces.

实例代码1:

#include

#include

#include

int main(int argc,char**argv)

{

int pid=fork();

if(pid == -1)

{

print(“error!”);

}

else if(pid == 0)

{

print(“This is the child process!”);

}

else

{

print(“This is the parent process! child process id = %d”, pid);

}

return 0;

}

示例代码2:#include

#include

#include

#include

#define MAX_COUNT 200

#define BUF_SIZE 100

void main(void)

{

pid_t pid;

int i;

char buf[BUF_SIZE];

fork();

pid = getpid();

for (i = 1; i <= MAX_COUNT; i++) {

sprintf(buf, “This line is from pid %d, value = %d\n”, pid, i);

write(1, buf, strlen(buf));

}

}

为什么用write,而不用printf呢?because printf() is “buffered,” meaning printf() will group the output of a process together,这样,会把子进程和父进程的输出混起来。所以用use the “unbuffered” write。

示例代码3:

#include

#include

#define MAX_COUNT 200

void ChildProcess(void); /* child process prototype */

void ParentProcess(void); /* parent process prototype */

int main(void)

{

pid_t pid;

pid = fork();

if (pid == 0)

ChildProcess();

else

ParentProcess();

return 0;

}

void ChildProcess(void)

{

int i;

for (i = 1; i <= MAX_COUNT; i++)

printf(” This line is from child, value = %d\n”, i);

printf(” *** Child process is done ***\n”);

}

void ParentProcess(void)

{

int i;

for (i = 1; i <= MAX_COUNT; i++)

printf(“This line is from parent, value = %d\n”, i);

printf(“*** Parent is done ***\n”);

}

4、Error Codes

出错返回错误信息如下:

EAGAIN :达到进程数上限.

ENOMEM :没有足够空间给一个新进程分配.

fork()系统在Linux中的返回值是没有NULL的.

&lbrack;fork&rsqb;Linux中的fork函数详解

—————————————————————————————————- …

Unix&sol;Linux中的fork函数

fork函数介绍 一个现有进程可以调用fork函数创建一个新进程.该函数定义如下: #include pid_t fork(void); // 返回:若成功则在子进程 …

linux中的fork&lpar;&rpar;函数以及标准I&sol;O缓冲

1. fork()创建的新进程成为子进程.一次调用,两次返回,子进程的返回值是0,而父进程的返回值是新子进程的进程ID,如果出现错误,fork返回一个负值. 2. 可以通过fork返回的值来判断当前进 …

linux中的fork函数的基本用法

代码: #include #include #include #include

Linux编程之fork函数

在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi …

【Linux 进程】fork函数详解

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

解析Linux中的VFS文件系统机制

今天的文章Linux中fork函数作用,深入解析Linux中的fork函数分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10156.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注