c语言怎么调用fork函数,C语言编程创建函数fork() 执行解析.pdf

C语言编程创建函数fork() 执行解析

由 提供

C 语言编程创建函数fork() 执行解析

概述

最近在看进程间的通信,看到了fork() 函数,虽然以前用过,这次经过思考加深了理解。现总结

如下:

1.函数本身

(1)头文件

#include

#include

(2)函数原型

pid_t fork( void);

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

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

1

(3)函数说明

一个现有进程可以调用fork 函数创建一个新进程。由fork 创建的新进程被称为子进程(chil

d process) 。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注

意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,子进程

有了独立的地址空间。

2.代码执行解释

(1)代码如下图所示

更多资讯:

由 提供

(2)分析

由操作系统相关知识可知,进程是系统资源分配的基本单位,因此子进程与父进程不共享进

程资源空间。在执行代码段第8 行之前,系统中只有默认的主进程。在执行完代码段第8 行

后,系统中就有了两个进程,即主进程和由其创建的子进程。

创建子进程,fork()函数返回两个数值,若创建成功,子进程中返回0;父进程返回子进程ID。用

资源空间图示如下:

执行了fork() 函数后,主进程为父进程生成了一份资源空间的副本。主进程中的pid 为子进程

的pid(pid>0),子进程中的pid 为0 。

在fork() 函数之后父进程与子进程都从下一行执行,即第9 行。因为主进程中pid>0,可以执行

else if(pid>0)段代码,子进程pid=0,可以执行else if(pid==0)段代码。

(3)代码执行结果如下:

更多资讯:

由 提供

可见,"Before the fork ..."只执行了一次。"After the fork ..."执行了两次。

(具体的执行结果,可能会由于进程调度的不同,后面的四个输出顺序可能不同。不过第一个输

出的一定是"Before the fork ...") 。

参考资料

/news597.html

更多资讯:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在C语言包含进程通讯相关的头文件,如<sys/types.h>、<sys/ipc.h>、<sys/msg.h>等。 然后,可以定义一个消息结构体,用来存储进程间通讯的消息内容。例如: ``` struct message { long mtype; // 消息类型 char mtext[256]; // 消息内容 }; ``` 接下来,可以使用msgget()函数创建一个消息队列,用来存储进程间通讯的消息。例如: ``` key_t key = ftok(".", 'a'); // 生成消息队列的key值 int msgid = msgget(key, IPC_CREAT | 0666); // 创建消息队列 ``` 然后,可以使用fork()函数创建一个子进程,用来发送和接收消息。例如: ``` pid_t pid = fork(); if (pid == ) { // 子进程 // 发送消息 struct message msg; msg.mtype = 1; strcpy(msg.mtext, "Hello, parent process!"); msgsnd(msgid, &msg, sizeof(msg.mtext), ); // 接收消息 msgrcv(msgid, &msg, sizeof(msg.mtext), 2, ); printf("Child process received message: %s\n", msg.mtext); } else if (pid > ) { // 父进程 // 接收消息 struct message msg; msgrcv(msgid, &msg, sizeof(msg.mtext), 1, ); printf("Parent process received message: %s\n", msg.mtext); // 发送消息 msg.mtype = 2; strcpy(msg.mtext, "Hello, child process!"); msgsnd(msgid, &msg, sizeof(msg.mtext), ); } else { // 创建子进程失败 perror("fork"); exit(1); } ``` 最后,需要使用msgctl()函数删除消息队列,释放资源。例如: ``` msgctl(msgid, IPC_RMID, NULL); ``` 这样,一个简单的进程通讯的源文件就完成了。完整的代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> struct message { long mtype; char mtext[256]; }; int main() { key_t key = ftok(".", 'a'); int msgid = msgget(key, IPC_CREAT | 0666); pid_t pid = fork(); if (pid == ) { // 子进程 // 发送消息 struct message msg; msg.mtype = 1; strcpy(msg.mtext, "Hello, parent process!"); msgsnd(msgid, &msg, sizeof(msg.mtext), ); // 接收消息 msgrcv(msgid, &msg, sizeof(msg.mtext), 2, ); printf("Child process received message: %s\n", msg.mtext); } else if (pid > ) { // 父进程 // 接收消息 struct message msg; msgrcv(msgid, &msg, sizeof(msg.mtext), 1, ); printf("Parent process received message: %s\n", msg.mtext); // 发送消息 msg.mtype = 2; strcpy(msg.mtext, "Hello, child process!"); msgsnd(msgid, &msg, sizeof(msg.mtext), ); } else { // 创建子进程失败 perror("fork"); exit(1); } msgctl(msgid, IPC_RMID, NULL); return ; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值