微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 进程控制开发之:实验内容

进程控制开发之:实验内容

时间:08-13 来源:3721RD 点击:

printf("Error occured!\n");

}

do

{

child = waitpid(child2, NULL, WNOHANG ); /* 非阻塞式等待 */

if (child == 0)

{

printf("The child2 process has not exited!\n");

sleep(1);

}

} while (child == 0);

if (child == child2)

{

printf("Get child2 exit code\n");

}

else

{

printf("Error occured!\n");

}

}

exit(0);

}

(3)首先在宿主机上编译调试该程序:

$ gcc multi_proc.c –o multi_proc(或者使用Makefile)

(4)在确保没有编译错误后,使用交叉编译该程序:

$ arm-linux-gcc multi_proc.c –o multi_proc (或者使用Makefile)

(5)将生成的可执行程序下载到目标板上运行。

4.实验结果

在目标板上运行的结果如下所示(具体内容与各自的系统有关):

$ ./multi_proc

In child1: execute 'ls -l' /* 子进程1的显示, 以下是"ls –l"的运行结果 */

total 28

-rwxr-xr-x 1 david root 232 2008-07-18 04:18 Makefile

-rwxr-xr-x 1 david root 8768 2008-07-20 19:51 multi_proc

-rw-r--r-- 1 david root 1479 2008-07-20 19:51 multi_proc.c

-rw-r--r-- 1 david root 3428 2008-07-20 19:51 multi_proc.o

-rw-r--r-- 1 david root 1463 2008-07-20 18:55 multi_proc_wrong.c

In child2: sleep for 5 seconds and then exit /* 子进程2的显示 */

In father process: /* 以下是父进程显示 */

Get child1 exit code /* 表示子进程1结束(阻塞等待)*/

The child2 process has not exited! /* 等待子进程2结束(非阻塞等待)*/

The child2 process has not exited!

The child2 process has not exited!

The child2 process has not exited!

The child2 process has not exited!

Get child2 exit code /* 表示子进程2终于结束了*/

因为几个子进程的执行有竞争关系,因此,结果中的顺序是随机的。读者可以思考,怎样才可以保证子进程的执行顺序呢?

7.4.2 编写守护进程

1.实验目的

通过编写一个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程程序。

2.实验内容

在该实验中,读者首先建立起一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。在这里,子进程和守护进程的退出消息都在系统日志文件(例如"/var/log/messages",日志文件的全路径名因版本的不同可能会有所不同)中输出。子进程退出后,守护进程循环暂停,其间隔时间为10s。

3.实验步骤

(1)画出该实验流程图。

该程序流程图如图7.9所示。

图7.9 实验7.4.2流程图

(2)实验源代码。

具体代码设置如下:

/* daemon_proc.c */

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

#include <sys/wait.h>

#include <syslog.h>

int main(void)

{

pid_t child1,child2;

int i;

/*创建子进程1*/

child1 = fork();

if (child1 == 1)

{

perror("child1 fork");

exit(1);

}

else if (child1 > 0)

{

exit(0); /* 父进程退出*/

}

/*打开日志服务*/

openlog("daemon_proc_info", LOG_PID, LOG_DAEMON);

/*以下几步是编写守护进程的常规步骤*/

setsid();

chdir("/");

umask(0);

for(i = 0; i < getdtablesize(); i++)

{

close(i);

}

/*创建子进程2*/

child2 = fork();

if (child2 == 1)

{

perror("child2 fork");

exit(1);

}

else if (child2 == 0)

{ /* 进程child2 */

/*在日志中写入字符串*/

syslog(LOG_INFO, " child2 will sleep for 10s ");

sleep(10);

syslog(LOG_INFO, " child2 is going to exit! ");

exit(0);

}

else

{ /* 进程child1*/

waitpid(child2, NULL, 0);

syslog(LOG_INFO, " child1 noticed that child2 has exited ");

/*关闭日志服务*/

closelog();

while(1)

{

sleep(10);

}

}

}

(3)由于

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top