Menu
Woocommerce Menu

进程控制与进程通信编程,6网络配置

0 Comment

动态路由(zebra软件提供)

   variable = 42;

  # UPS connected and working correctly.

cd /etc/sysconfig/network-s[tab]
ifcfg-eth0 第一块网卡的配置 ifcfg-eth1 第二块…. DEVICE=eth0
#对那个网卡进行配置,eth0第一块网卡 HWAD…

  int rtn; /* 子进程的返回数值*/

  pf::powerfail:/sbin/shutdown -f -h +2 “Power Failure; System
Shutting Down”

GATEWAY=192.168.100.254 #网关

此时此刻,我们还没有完全理解fork()函数,再来看下面的一段程序,看看究竟会产生多少个进程,程序的输出是什么?

要执行的进程. 假如process 域以一个`+’ 开头, init 不会在utmp 和wtmp
文档中为此进程记帐. 这是由于getty 自己主持utmp/wtmp 记帐的需要,
同时这也是个历史遗留的漏洞.

DNS2=218.30.19.50

Linux下的C编程实战(三)

  在init的配置文件中有这么一行:

net.ipv4.ip_forward是路由功能,0关闭,1打开

  lock_it.sem_op =  – 1; /*定义操作*/

在进入ondemand 运行级时才会执行标记为ondemand 的那些进程. 无论怎样,
实际上没有改变运行级(ondemand 运行级就是`a’, `b’, 和`c’).

net.ipv4.ip_forward = 0

运行输出:

  rc.sysinit约有850多行,但是每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在本文中列出来,也不做具体的介绍。

静态路由命令route

  int i;

  第三部分:系统初始化

service network restart 让修改的网卡文件生效

CLONE_FILES

inittab 文档中条目的唯一标识, 限于1-4 个字符(假如是用版本号小于5.2.18
或a.out 的库编译生成的sysvinit 程式, 则仅限于2 个字符).

ifconfig

 

  getty进程来提供虚拟终端设备的服务,例如:

把linux当路由器去用

标志

# 1 – Single user mode

Ctrl + c 终止命令

  int count = 1;

# 0 – halt (Do NOT set initdefault to this)

NETMASK=255.255.255.0

   char tempch;

  这些守护进程也启动完成了,rc程序也就执行完了,然后又将返回init继续下一步。

BOOTPROTO=none

    exit(1);

2:2345:respawn:/sbin/mingetty tty2

 

    exit(1);

  它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash
shell的脚本,它主要

 

 子进程与父进程共享相同的文件描述符(file descriptor)表

# 2 – Multiuser, without NFS (The same as 3, if you do not have
networking)

 

   void **child_stack;

  ###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行(respawn)

 

int pipe(int filedis[2]);

  bootwait 在系统启动时运行,init等待进程完成。忽略runlevel

标准网卡配置

  fclose(in_file);

  3. action

ONBOOT=yes

int variable, fd;

respawn

DNS1=192.168.100.1 #dns地址

    printf(“in the spawning (parent) process…”n”);

ctrlaltdel

IPADDR=192.168.100.1 #ip地址

  }

  si::sysinit:/etc/rc.d/rc.sysinit

DEVICE=eth0

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

id :runlevels :action :process

GATEWAY=192.168.100.254

  lock_it.sem_num = 0; /*设置哪个信号量*/

本文档在引导时执行/etc/rc 并且在ty1-tty4 上启动getty 进程.

网卡配置文件

};

  label:runlevel:action:process

DEVICE=eth0

    printf(“Error opening pipe.”);

ttyS1::respawn:-/bin/sh

DNS配置

系统调用exit的功能是终止本进程,其函数原型为:

  ondemand 当系统指定特定的运行级别A、B、C时运行

DNS1=61.134.1.4 #DNS地址,RHEL6开始的

   }

  ud 是升级进程

BOOTPROTO=none #静态还是动态

      printf(“This is child process”n”);

 

ONBOOT=yes

  }

2:23:respawn:/sbin/getty tty2 VC linux

vi /etc/resolv.conf 编辑dns配置文件

在Linux中可使用exec函数族,包含多个函数(execl、execlp、execle、execv、execve和execvp),被用于启动一个指定路径和文件名的进程。

  id是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。

本文出自 “王道–旭忠著(MakeWong)” 博客

    fgets(command, MAX_CMD_LEN, stdin);

#

cd /etc/sysconfig/network-s[tab]

    printf(“%d bytes of data received from spawned process: %s”n”,

 

vi /etc/sysctl.conf 编辑内核配置文件

 

  powerwait 当收到SIGPWD信号,并且init等待进程结束时运行

ONBOOT=yes #是否使用这个配置

wait可获得此值。

action

 

  while ((count = fread(buf, 1, BUFFER_LEN, in_file)) > 0)

  1:2345:respawn:/sbin/mingetty tty1

nameserver 61.134.1.4 #让计算机的dns指向为61.134.1.4,RHEL5和5之前的

#include <sys/ipc.h>

  initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项,init将在控制台上请求输入runlevel。

TYPE=Ethernet #以太网类型

File Read Error

  第四部分:启动对应运行级别的守护进程

DEVICE=eth0 #对那个网卡进行配置,eth0第一块网卡

int main(int argc, char *argv[]) {

  powerfail 当init收到SIGPWR信号时运行

删除到200.200.200.0,掩码为255.255.255.0的网段的下一跳是192.168.100.2

  }

1:23:respawn:/sbin/getty tty1 VC linux

 

2.进程控制

initdefault 条目给出系统引导完成后进入的运行级, 假如不存在这样的条目,
init 就会在控制台询问要进入的运行级. process 域被忽略.

动态获取

   _exit(0);

本进程在电源不足时执行. 通常在有进程把UPS 和电脑相连时通知init 进程,
Init 在继续其他工作之前要等待此进程结束.

静态配置

fork在英文中是“分叉”的意思,这个名字取得很形象。一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就“分叉”了

#

ifcfg-eth0 第一块网卡的配置

 含义

  respawn 不管何时终止都重新启动进程

nslookup dns测试

void *shmat(int shmid, void *addr, int flag); /*
将共享内存连接到自身地址空间中*/

# “3 个键” 按下时要做的工作.

ifcfg-eth1 第二块….

fork

l5:5:wait:/etc/rc.d/rc 5

BOOTPROTO=dhcp

wait的作用为发出调用的进程只要有子进程,就睡眠到它们中的一个终止为止;waitpid等待由参数pid指定的子进程退出。

  sendmail:邮件服务器sendmail

 

  {

在系统引导期间执行本进程. runlevels 域被忽略.

hostname 查看主机名

  {

once

USERCTL=no #不知道

    }

  对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:

net.ipv4.ip_forward = 1

 

  si 是系统初始化的进程

HWADDR=08:00:27:49:57:1c #网卡绑定的mac地址,这行最好删了

    /* 从终端读取要执行的命令*/

init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。

NM_CONTROLLED=yes #不知道

Linux的进程间通信(IPC,InterProcess
Communication)通信方法有管道、消息队列、共享内存、信号量、套接口等。

  Runlevel 6 是关闭所有运行的进程并重新启动系统。

route add -net 200.200.200.0 netmask 255.255.255.0 gw 192.168.100.2

  pid_t pid;

# 运行级2和3: 在控制台生成getty 进程, 运行级为3时在modem 上生成getty.

配置结束后执行

CLONE_THREAD

x:5:respawn:/etc/X11/prefdm -nodaemon

查看ip

   return 0;

# Default runlevel. The runlevels used by RHS are:

 

#define INPUT 0

 

route del -net 200.200.200.0 netmask 255.255.255.0 gw 192.168.100.2

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

  boot 在系统启动时运行,忽略runlevel

 

际地址。此后,进程可以对此地址进行读写操作访问共享内存。

 

sysctl -p 让刚刚做的修改生效

  /*创建子进程*/

  id:runlevel:action:process

改为

      exit(1);

# the system in a certain run-level.

IPV6INIT=no #ipv6初始化

这个函数基本上实现了一个shell的功能,它读取用户输入的进程名和参数,并启动对应的进程。

  当rc.sysinit程序执行完毕后,将返回init继续下一步。

添加到200.200.200.0,掩码为255.255.255.0的网段的下一跳是192.168.100.2

};

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

 

(2)若此信号量的值为正,则允许进行使用该资源,进程将进号量减1;

rc::bootwait:/etc/rc

 

CLONE_VFORK

  pf 指当UPS表明断电时运行的进程

NETMASK=255.255.255.0 #子网掩码

(4)内核调度该进程进入内核状态,再由内核状态返回用户状态执行。该进程在用户状态运行一定时间后,又会被调度程序所调度而进入内核状态,由此转入就绪态。有时进程在用户状态运行时,也会因为需要内核服务,使用系统调用而进入内核状态,服务完毕,会由内核状态转回用户状态。要注意的是,进程在从内核状态向用户状态返回时可能被抢占,这是由于有优先级更高的进程急需使用CPU,不能等到下一次调度时机,从而造成抢占;

inittab文件内容:

IPADDR=192.168.100.1

    }

  # This does, of course, assume you have powerd installed and your

 

(1)mkfifo(“fifoexample”,”rw”);

  6:2345:respawn:/sbin/mingetty tty6

traceroute ip 跳数计数(本地到目标ip经过了多少路由)

 

off

 

clone是Linux2.0以后才具备的新功能,它较fork更强(可认为fork是clone要实现的一部分),可以使得创建的子进程共享父进程的资源,并

  代码:

 

  if ((pid = fork()) ==  – 1)

  off 禁止进入,因此该进程不运行

(1)进程被父进程通过系统调用fork创建而处于创建态;

  l5:5:wait:/etc/rc.d/rc 5

#include <sys/sem.h>

powerfailnow

  }

这是个和老的Linux inittab 文档类似的例子文档:

  printf(“semaphore id=%d”n”, id);

runlevels 域能够包含表示不同运行级的多个字符, 例如123
表示本进程在运行级为1, 2 和3 时都要启动. 用于ondemand 条目的runlevels
域能够包含A , B , 或C . 用于sysinit , boot , 和bootwait 条目的runlevels
域被忽略.

 {

  从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login
程序来验证用户的身份。

  i = semctl(id, 0, GETVAL, 0);

  Runlevel 3
是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。

程序的输出结果告诉我们,子进程将文件关闭并将变量修改(调用clone时用到的CLONE_VM、CLONE_FILES标志将使得变量和文件描述符表被共

# When our UPS tells us power has failed, assume we have a few minutes

  semctl(id, 0, SETVAL, options); /*设置索引0的信号量*/

# 4 – unused

{

  # Run xdm in runlevel 5

(3)若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1);

# 进入默认的运行级

wait系统调用包括:

  once 每一个runlevel级别运行一次

  else

  ###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)

  out_file = fopen(“pipeexample”, “w”);

  pr:12345:powerokwait:/sbin/shutdown -c “Power Restored; Shutdown
Cancelled”

  }

  x:5:respawn:/etc/X11/prefdm -nodaemon

      execlp(command, command);

(8) 讨论有关runlevels (运行级) 的概念,
每一个运行级都有他自己启动进程的集合. 有效的运行级为0 -6
加上用于ondemand 条目的A , B 和C . inittab
文档中的每一个条目有如下的格式:

后清除信号量:

  ctrlaltdel
当Ctrl+Alt+Del三个键同时按下时运行,把SIGINT信号发送给init。忽略runlevel

    command[strlen(command) – 1] = 0;

  network:激活已配置网络接口的脚本程序

ca::ctrlaltdel:/sbin/shutdown -t5 -rf now

#include <stdio.h>

#

    write(file_descriptors[OUTPUT], “test data”, strlen(“test
data”));

  kbrequest
当init从键盘中收到信号时运行。这里要求键盘组合符合KeyBoardSigral(参见/usr/share/doc/kbd-*关于键盘组合的文档)

  }

  portmap:RPC portmap管理器,它管理基于RPC服务的连接

索后取得的成果。

在init 收到电源已恢复的通知后立即执行此进程.

本章讲述了Linux进程的概念,并以多个实例讲解了进程控制及进程间通信方法,理解这一章的内容可以说是理解Linux这个操作系统的关键。

  /etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

 

  powerokwait 当收到SIGPWD信号且/etc/文件中的电源状态包含OK时运行

  char buf[BUFFER_LEN];

  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

int main()

  以上面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:

指定进程,这实在是很妙的。fork和exec的搭配巧妙地解决了程序启动另一程序的执行但自己仍继续运行的问题,请看下面的例子:

si::sysinit:/etc/rc.d/rc.sysinit

  /*创建无名管道*/

  3:2345:respawn:/sbin/mingetty tty3

{

4:2345:respawn:/sbin/mingetty tty4

 

  Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root
用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc
/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

{

注意: 对于getty 或其他的注册进程, id 必须是响应的终端线路的tty 后缀, 如1
响应tty1 , 否则, 注册过程不能正常的工作.

  }

  pr 是在系统真正关闭之前,UPS发出电源恢复的信号时需要运行的进程

不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的是实际的物理内存;常用的方式是通过shmXXX函数族来实现共享内存:

boot

void main()

  login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。

    {

什么也不做.

This is parent process

#

 

  第六部分:登录系统,启动完成

 

ttyS2::respawn:-/bin/sh

  pipe(file_descriptors);

举例

}

理解Runlevel:

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

  仔细学习例子文件,学习应用其中关于inittab的语法格式。该文件的大多数内容都可以忽略,因为超过一半的内容都是注释,剩余的一些文件内容主要是用来实现某些特殊的功能:

标签:

发表评论

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

相关文章

网站地图xml地图