linux编程之进程控制

(一)fork
  #include <unistd.h>
  pid_t fork(void);

返回值:有两个,一个是子进程的ID,另一个为零。当返回值为0时,进入子进程,大于0进入父进程,返回-1时创建进程错误。

子进程与父进程的比较:
(1)子进程与父进程的进程ID不同。且父进程ID不同。
(2)内存布局: 子进程是父进程的副本,其中子进程的数据空间,堆,栈是父进程的副本,但是共享真正文段。
(3)执行顺序:子进程与父进程执行顺序不确定,取决于内核所使用的调度算法。
(4)文件共享:父进程所有打开的文件描述符都会赋值到子进程,父进程与子进程每个相同的打开文件描述符共享一个文件表项。即子进程操作文件直接影响父进程对该文件的操作,最明显的是文件偏移量收到影响。其图如下所示:

例如:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x = 33,y = 44;

    pid_t pid;

    if( (pid = fork()) == -1 )
    {
        perror("fork err\n");
        exit(EXIT_FAILURE);
    }
    else if( pid == 0 )
    {
        x ++;
        y ++;
        printf("child : x = %d  y = %d\n",x,y);
        exit( EXIT_SUCCESS);
    }
    wait();
    printf("parent: x = %d y = %d\n",x,y);

    return 0;
}
fork的使用场景:

(1)父进程希望复制自己,使得父进程和子进程同时执行不同的代码段,即在网络服务中是最常见的,父进程等待客户端的服务请求,当请求到来时,父进程fork一个子进程来处理子进程的请求,这时父进程可以继续等待下一个服务请求。
(2)使得子进程执行一个不同的程序,需要fork一个子进程,在此子进程中执行exec执行新的程序。

(二)vfork函数
 #include <sys/types.h>
 #include <unistd.h>
 pid_t vfork(void);

返回值为:与fork几乎相同

与fork函数的不同:

(1)vfork一般是创建一个进程来执

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值