fork和exec函数

本文深入解析了UNIX系统中fork和exec函数的使用方法及其在进程创建和程序执行中的作用。fork函数允许一个进程创建自己的副本,使每个副本能独立执行不同任务;而exec则将当前进程映像替换为新的程序文件,常用于执行shell命令。此外,文章还介绍了getsockname和getpeername函数在套接字编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

fork和exec函数
fork函数时UNIX中派生新进程的唯一方法。
#include<unistd.h>
pid_t fork(void)
如果你以前从未接触过该函数,那么理解fork最困难之处在于它调用一次,它却返回两次,它在调用进程(称为父进程)中返回一次,返回值是新派生进程(称为子进程)的进程ID号,在子进程又返回一次,返回值为0。因此,返回值本身告知当前进程是子进程还是父进程。
fork在子进程返回0而不是父进程的进程ID的原因在于:任何子进程只有一个父进程,且子进程总是可以通过调用getppid获取服务父进程的进程ID。相反,父进程可以有许多子进程,而且无法获取各个子进程的进程ID。如果父进程想要跟踪所有子进程的进程ID,那么它必须记录每次fork的返回值
父进程中调用fork之前打开的所有描述符在fork返回之后由于子进程分享,我们将看到网络服务器利用了这种特性:父进程调用accept之后调用fork、所接受的已连接套接字随后就在父进程与子进程之间共享。通常情况下子进程接着读写这个套接字,父进程关闭这个已连接的套接字。
fork由两个典型的用法
(1)一个进程创建一个自身的副本,这样每个副本都可以在另一个副本执行其他的任务的同时处理各自的某个操作。这是网络服务器的典型用法。
(2)一个进程想要执行另一个程序、既然创建新进程的唯一方法是调用fork,该进程于是首先调用fork创建一个自身的副本,然后其中一个副本(通常为子进程)调用exec(接下去介绍)把自身替换成新程序。这是诸如shell子类的程序的典型用法
存放在硬盘上的可执行程序文件能够被unix执行的唯一方法是:由一个现有的进程调用6个exec中某一个(当6个函数中是哪一个调用并不重要时,我们往往把它们统称为exec函数)。exec把当前进程映像替换新的程序文件,而且该新的程序通常从main函数开始执行。进程ID并不改变。我们称调用exec的进程为调用进程,称新执行的程序为新程序。
这6个exec函数之间的区别在于:(a)待执行的程序文件是由文件名还是由路径名指定(b)新程序的参数是一一列出还是由一个指针数组来引用(c)把调用进程的环境传递给新程序还是给新程序指定的新环境
这些函数只有出错才返回到调用者,否则控制被传递给新程序的起始点通常就是main函数。

getsockname和getpeername函数
这两个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址(getpeername)
#include<sys/socket.h>
int getsockname(int sockfd,struct sockaddrlocaladdr,socklen_t addrlen)
int getpeername(int sockfd,struct sockaddr
peeraddr,socklen_t
addrlen)
注意,这两个函数的最后一个参数都是值-结果参数。这就是说,这两个函数都得装填由localaddr或peeraddr指针所指的套接字地址结构
需要这两个函数的理由如下描述
在一个没有调用bind的TCP客户上,connect成功返回后,getsockname用于返回由内核赋予该连接的本地IP地址和本地端口号
在以端口号0调用bind(告知内核去选择本地端口号)后,getsockname用于返回由内核赋予的本地端口号
getsockname可以用于获取某个套接字的地址族
在一个以通配IP地址调用bind的TCP服务器上,与某个客户的连接一旦建立(accept成功返回),getsockname就可以用于返回由内核赋予该连接的本地IP地址,在这样的调用中,套接字描述符参数必须是已连接套接字的描述符,而不是监听套接字的描述符
当一个服务器是由调用过accept的某一个进程通过exec执行程序时,它能够获取客户身份的唯一途径便是getpeername。fork并exec某个TCP服务器程序时就是如此情形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值