文档章节

Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程

AlexTuan
 AlexTuan
发布于 2016/04/04 17:51
字数 602
阅读 68
收藏 1

Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程

问题引入:当你想循环使用exec调用另外一个程序时,发现只调用了一次就结束了。这是因为,exec函数通过运行新程序来替换当前程序,因此,后面的代码都没有运行。 为了达到我们想要的效果,在此引入fork()系统调用。

实例:RSS订阅功能
int main(int argc, char *argv[]) {
  char *feeds[] = {"http://www.cnn.com/rss/celebs.xml",
                   "http://www.rollingstone.com/rock.xml",
                   "http://eonline.com/gossip.xml"};
  int times = 3;
  int i;
  char *phrase = argv[1];
  for (i = 0; i < times; i++) {
    char var[255] = {};
    sprintf(var, "RSS_FEED=%s", feeds[i]);
    char *vars[] = {var, NULL};
    if (execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", phrase, NULL, vars) == -1) {
      fprintf(stderr, "%s\n", strerror(errno));
      return 1;
    }
  }
  return 0;
}

在这段代码中,有一个for (i = 0; i < times; i++)循环,其中包含一个execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", NULL, vars)语句,用于调用一个叫作rssgossip.py的脚本。

我们的本意是想循环调用,但是实际上,这个语句只会运行一次。我们尝试用fork来让它多次运行。

*fork()*的使用
  1. 使用步骤:
    1. 复制进程:第一步用fork()系统调用来复制当前进程。进程需要以某种方式区分自己是父进程还是子进程,为此fork()函数向子进程返回0,向父进程返回非零值。
    2. 如果是子进程,就调用exec()。 现在你有两个独立的进程,子进程在运行rssgossip.py脚本,而原来的父进程可以继续做其他事,完全不受干扰。
  2. 修改原有的程序代码

主要改动内容为: 1. 创建一个子进程pid_t pid; 2. 使用fork()函数复制当前进程。 3. 监控返回值,如果为0则表示为子进程,则使用execle()调用脚本取代该进程。 4. 父进程在execle()后面的代码可以继续执行,即,可以循环创建子进程来获得rss订阅内容。

for (i = 0; i < times; i++) {
    char var[255];
    sprintf(var, "RSS_FEED=%s", feeds[i]);
    char *vars[] = {var, NULL};
    pid_t pid;
    if ((pid = fork()) < 0) {
      fprintf(stderr, "Can't fork process: %s\n", strerror(errno));
      return 1;
    } else if (pid == 0) {
      if (execle("/usr/bin/python", "/usr/bin/python", "./fake_rss.py", phrase, NULL, vars) == -1) {
        fprintf(stderr, "Can't run script: %s\n", strerror(errno));
        return 1;
      }
    }
  }
示例代码

fork sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 第九章 进程与系统调用 exec函数

Head First C 第九章 进程与系统调用 exec函数 系统调用 C程序无论做什么,都要靠操作系统。如果它想与硬件打交道,就要进行系统调用系统调用是操作系统内核的函数。 什么是内核? 在大部分计...

AlexTuan
2016/04/03
42
0
Linux执行ls,会引起哪些系统调用

从一个问题说起 Linux执行ls,会引起哪些系统调用? A. nmap B. read C. execve D. fork 答案是read、exec系列 首先我们讨论一下什么是系统调用(system calls)? 用户借助UNIX/linux直接提...

realsa
2016/06/23
464
0
进程创建、exec函数簇,等待进程,替换进程实现

进程调度 概述:创建子进程的函数fork()函 数, 父进程在创建子进程的时候子进程会复制父函数的数据段, 代码段是共享,但是数据段是复制! fork函数与vfork函数的区别: 1、fork:子进程拷贝...

TheRoodToDeath
2017/03/19
0
0
进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1、Unix shell的功能 shell是一个管理进程和运行程序的程序。所有常用的shell都有3个主要功能: (1)运行程序; (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语...

木子叶
2014/08/02
410
0
运行 tail | grep 后按下 Ctrl – C 的过程中发生了什么

原文出处:暗无天日 从 https://ubuntuforums.org/showthread.php?t=1761120&s=bbaf101ffbcc9abdb032d90cff01fc36 中看到的,记录一下 在shell中运行 tail|grep 时发生了什么 运行tail 运行g...

暗无天日
2018/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
4
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
997
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部