Linux启动新进程的几种方法及比较

作者&投稿:播泳 (若有异议请与网页底部的电邮联系)
linux中进程的三种启动方式~

太过简短了.不太明白是什么意思.
前几天在一个考材上看到. linux的服务有三种启动方式.
1 init
2 /etc/rcX.d
3 xinetd
我想由用户从 shell启动应该怎么也算是一种吧. 我对基本概念都不怎么清楚.

bnLinux系统中的进程分为:独立守护进程和被动守护进程。bn独立守护进程由相应的独立启动,而被动守护进程由Xinetd服务监听启动。了解linux请关注《linux就该这么学》这本书。

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。一、system函数调用 system函数的原型为: #include int system (const char *string);它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system函数返回错误代码127;如果是其他错误,则返回-1。否则,system函数将返回该命令的退出码。 注意:system函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system函数调用会立即返回。 可以先先下面的例子,源文件为new_ps_system.c,代码如下: #include #include int main() { printf("Running ps with system\n"); //ps进程结束后才返回,才能继续执行下面的代码 system("ps au");// 1 printf("ps Done\n"); exit(0); }该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下: 如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。 一般来说,使用system函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system函数的效率不高。 二、替换进程映像——使用exec系列函数 exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。 exec系列函数的类型为: #include char **environ; int execl (const char *path, const char *arg0, ..., (char*)0); int execlp(const char *file, const char *arg0, ..., (char*)0); int execle(const char *path, const char *arg0, ..., (char*)0, char *const envp[]); int execv (const char *path, char *const argv[]); int execvp(cosnt char *file, char *const argv[]); int execve(const char *path, char *const argv[], char *const envp[]);这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。 承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为: 注:arg0为程序的名字,所以在这个例子中全为ps。 char *const ps_envp[] = {"PATH=/bin:usr/bin", "TERM=console", 0}; char *const ps_argv[] = {"ps", "au", 0}; execl("/bin/ps", "ps", "au", 0); execlp("ps", "ps", "au", 0); execle("/bin/ps", "ps", "au", 0, ps_envp); execv("/bin/ps", ps_argv); execvp("ps", ps_argv); execve("/bin/ps", ps_argv, ps_envp);下面我给出一个完整的例子,源文件名为new_ps_exec.c,代码如下: #include #include #include int main() { printf("Running ps with execlp\n"); execlp("ps", "ps", "au", (char*)0); printf("ps Done"); exit(0); }运行结果如下: 细心的话,可以发现,最后的ps Done并没有输出,这是偶然吗?并不是,因为我们并没有再一次返回到程序new_ps_exec.exe上,因为调用execlp函数时,new_ps_exec.exe进程被替换为ps进程,当ps进程结束后,整个程序就结束了,并没有回到原来的new_ps_exec.exe进程上,原本的进程new_ps_exec.exe不会再执行,所以语句printf("ps Done");根本没有机会执行。 注意,一般情况下,exec函数是不会返回的,除非发生错误返回-1,由exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但任何在原进程中已打开的目录流都将在新进程中被关闭。 三、复制进程映像——fork函数1、fork函数的应用 exec调用用新的进程替换当前执行的进程,而我们也可以用fork来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。 fork函数的原型为: #include #include pid_t fork();注:在父进程中,fork返回的是新的子进程的PID,子进程中的fork返回的是0,我们可以通过这一点来判断父进程和子进程,如果fork调用失败,它返回-1. 继承上面的例子,下面我给出一个调用ps的例子,源文件名为new_ps_fork.c,代码如下: #include #include #include #include int main() { pid_t pid = fork(); switch(pid) { case -1: perror("fork failed"); exit(1); break; case 0: //这是在子进程中,调用execlp切换为ps进程 printf("\n"); execlp("ps", "ps", "au", 0); break; default: //这是在父进程中,输出相关提示信息 printf("Parent, ps Done\n"); break; } exit(0); }输出结果为: 我们可以看到,之前在第二点中没有出现的ps Done是打印出来了,但是顺序却有点不对,这是因为,父进程先于子程序执行,所以先输出了Parent, ps Done,那有没有办法让它在子进程输出完之后再输出,当然有,就是用wait和waitpid函数。注意,一般情况下,父进程与子进程的生命周期是没有关系的,即便父进程退出了,子进程仍然可以正常运行。 2、等待一个进程 wait函数和waitpid函数的原型为: #include #include pid_t wait(int *stat_loc); pid_t waitpid(pid_t pid, int *stat_loc, int options);wait用于在父进程中调用,让父进程暂停执行等待子进程的结束,返回子进程的PID,如果stat_loc不是空指针,状态信息将被写入stat_loc指向的位置。 waitpid等待进程id为pid的子进程的结束(pid为-1,将返回任一子进程的信息),stat_loc参数的作用与wait函数相同,options用于改变waitpid的行为,其中有一个很重要的选项WNOHANG,它的作用是防止waippid调用者的执行挂起。如果子进程没有结束或意外终止,它返回0,否则返回子进程的pid。 改变后的程序保存为源文件new_ps_fork2.c,代码如下: #include #include #include #include int main() { pid_t pid = fork(); int stat = 0; switch(pid) { case -1: perror("fork failed"); exit(1); break; case 0: //这是在子进程中,调用execlp切换为ps进程 printf("\n"); execlp("ps", "ps", "au", 0); break; default: //这是在父进程中,等待子进程结束并输出相关提示信息 pid = wait(&stat); printf("Child has finished: PID = %d\n", pid); //检查子进程的退出状态 if(WIFEXITED(stat)) printf("Child exited with code %d\n", WEXITSTATUS(stat)); else printf("Child terminated abnormally\n"); printf("Parent, ps Done\n"); break; } exit(0); }输出为: 可以看到这次的输出终于正常了,Parent的输出也在子进程的输出之后。 总结——三种启动新进程方法的比较 首先是最简单的system函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system函数要等待子进程的返回才能执行下面的语句。 exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。 fork则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。


Linux中启动进程的方法有哪些?哪种更好用?
从后台启动进程,其实就是在命令结尾处添加一个&符号。输入命令并运行之后,shell会提供给我们一个数字,此数字就是该进程的进程号。然后直接就会出现提示符,用户就可以继续完成其他工作。手工启动的2种方式,实际上它们有个共同的特点,就是新进程都是由当前shell这个进程产生的,换句话说,是shell创建了...

linux启动进程和关闭进程的命令linux启动进程
Linux开机启动顺序:1.加载内核 2.启动init(\/etc\/inittab)内核启动的第一个用户级别的进程,其pid始终为1,其它的开机启动脚本都是通过是通过这个进程来启动的。3.执行\/etc\/rc.d\/rc.sysinit 这是init执行的第一个脚本,这个脚本主要工作是进行系统的初始化,如:设置系统字体、启动swapping、设置主机...

Linux启动新进程的几种方法及比较
三、复制进程映像——fork函数1、fork函数的应用 exec调用用新的进程替换当前执行的进程,而我们也可以用fork来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。 fork函数的原型为: #include #include pid_t fork();注:在父进程中,fork返回的...

linux 重启进程
linux重启进程的方法步骤:1、首先使用ps -ef查找进程的执行语句并保留它;这个的目的是保留进程执行的参数不变;例如,重启单个mongodb的过程:查找:1 ps -ef|grep mongod 获得:1 root 2928 2903 0 14:51 pts\/0 00:00:00 grep \/usr\/local\/mongodb\/bin\/mongod --config \/etc\/mongodb.cnf ...

linux查看启动进程
1、打开linux系统,在linux的桌面的空白处右击。2、在弹出的下拉选项里,点击打开终端。3、在终端里面输入ps命令,就可以看到所有运行中程序的进程。

linux运行进程命令linux运行进程
1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。2.内存管理(MM)允许多个进程安全的...

Linux进程管理及作业控制的启动进程
键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。 由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种...

启动进程linux命令启动进程linux
linux查看某个进程是否启动的命令是?ps命令 -e现实所有进程 -f全格式 -h不显示标题 -l长格式 -a显示终端上所有进程,包括其它用户的进程 -r只显示正在运行的进程 -p指定pid linux启动过程步骤?开机--加电自检--读取CMOS设置--从硬盘引导记录查找系统所在位置--读取GRUB配置文件(\/boot\/grub\/grub....

linux系统下如何从后台启动进程?
你得查看后台存在的进程 #jobs#fg#bg两个命令是调入前台和后台的命令在命令后面加上一个 &比如:rm -rf \/tmp\/ & Linux 技巧:让进程在后台可靠运行的几种方法 WeiboGoogle+用电子邮件发送本页面 我们经常会碰到这样的问题,用 telnet\/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的...

Linux启动进程的命令
linux启动进程的命令可以用sh,python ,.\/文件名。下面是有关进程的操作:1.查进程 ps命令查找与进程相关的PID号:ps a 显示现行终端机下的所有程序,包括其他用户的程序。ps -A 显示所有程序。ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。ps -e 此参数的...

边坝县19757373884: linux中进程的三种启动方式 -
智建瑞朋: 不知道你要求的启动方式是从什么角度说.通常可以用rc[0-3].d下加自动启动脚步,或者用用户登录直接运行进程,或者在运行进程后面加“&”符号.

边坝县19757373884: Linux启动进程的方法有哪些? -
智建瑞朋: 有手动启动和调度启动两种方法,其中调度启动常用的命令为at、batch和crontab. 希赛里看来的资料,希望对你有帮助!

边坝县19757373884: linux怎么打开程序 -
智建瑞朋: 你先去学基础知识就行了,如果你不想学,那就最好改用 for windows 的版本……1、你在开始菜单里面找不到的程序,当然要用终端来运行,其实,可以用运行解决.印象里打开运行菜单的快捷键是 alt + f2 .你的开始菜单上面或许也有运行的...

边坝县19757373884: 简述linux进程的启动、终止的方式以及如何进行进程的查看.
智建瑞朋: 在Linux中启动一个进程有手工启动和调度启动两种方式: (1)手工启动 用户在输入端发出命令,直接启动一个进程的启动方式.可以分为: ①前台启动:直接在SHELL中输入命令进行启动. ②后台启动:启动一个目前并不紧急的进程,如打印进程.

边坝县19757373884: linux 怎么把进程启动到后台 -
智建瑞朋: 一、在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:$ ./test.sh & [1] 17208 $ jobs -l [1]+ 17208 Running ./test.sh & 二、对于已经在前台执行的命令,也可以重新...

边坝县19757373884: 简述Linux系统中的进程分为哪两类?分别以什么方式启动? -
智建瑞朋: 分为独立进程和非独立进程. 一般情况下,在/etc/init.d这个目录中看到脚本都是独立进程的脚本,可以使用server 脚本名 start 来启动, 在/etc/xinetd.d目录中存放的都是非独立进程,可以使用以下两个命令启动 chkconfig 非独立进程名 on service xinetd restart

边坝县19757373884: 如何linux 程序中启用其他进程,非阻塞,非popen -
智建瑞朋: 在Linux程序中启动其他进程可以用system函数,这个函数会等待它启动的那个程序结束才返回,所以它是一个阻塞调用.还有一种非阻塞的启动外部程序的方法,稍微复杂一点,是运用Linux的exec系列函数,之所以说系列函数是因为有不同的...

边坝县19757373884: linux怎么让程序开机自动启动 -
智建瑞朋: 1. 开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目录下的脚本文件,可以使init自动启动...

边坝县19757373884: 如何在Linux中从后台启动一个进程? -
智建瑞朋: 你得查看后台存在的进程 #jobs #fg #bg 两个命令是调入前台和后台的命令

边坝县19757373884: Linux的启动流程是什么? -
智建瑞朋: Linux的启动流程: 1、读取MBR的信息,启动Boot Manager ,Windows使用NTLDR作为Boot Manager,如果用户的系统中安装多个版本的Windows,用户就需要在NTLDR中选择要进入的系统.Linux通常使用功能强大,配置灵活的GRUB作为...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网