Linux轻松创建精灵进程 (linux 创建精灵进程)

在Linux系统中,精灵进程是一种特殊的进程,通常用于执行守护任务,例如后台运行服务器程序等。创建一个精灵进程并不难,本文将介绍如何使用C语言在Linux系统中创建一个简单的精灵进程。

1. 设置文件掩码

在Linux系统中,文件掩码(umask)用于限制文件的读、写、执行权限。通常精灵进程需要在后台运行,不需要与终端交互,这就需要将文件掩码设置为0,以确保子进程能够获得读写权限。

在C语言中,可以使用umask()函数来设置文件掩码,代码如下:

“`c

umask(0);

“`

2. 创建子进程并关闭文件描述符

在Linux系统中,可以通过fork()函数创建一个新的子进程,代码如下:

“`c

pid_t pid = fork();

“`

子进程会复制父进程的所有资源,包括打开的文件描述符。在创建精灵进程时,需要关闭所有的文件描述符,以避免子进程受到终端的影响。

可以通过遍历/proc/self/fd/目录下的文件来关闭所有的文件描述符,代码如下:

“`c

DIR *dir = opendir(“/proc/self/fd/”);

struct dirent *dentry;

int fd;

while ((dentry = readdir(dir)) != NULL) {

fd = atoi(dentry->d_name);

if (fd > 2) {

close(fd);

}

}

closedir(dir);

“`

这段代码会依次关闭所有大于2的文件描述符,其中0、1、2分别对应标准输入、标准输出、标准错误。关闭这些文件描述符可以确保子进程不会受到终端的干扰。

3. 脱离控制终端

在Linux系统中,控制终端是指用户登录系统时所使用的终端。精灵进程需要脱离控制终端,以避免受到终端关闭等信号的影响。

可以通过setsid()函数将子进程设置为新的会话组长和进程组长,并脱离控制终端,代码如下:

“`c

setsid();

“`

4. 改变工作目录

精灵进程通常需要在后台运行,因此需要将工作目录设置为根目录,以避免意外修改工作目录的影响。

可以通过chdir()函数将工作目录更改为根目录,代码如下:

“`c

chdir(“/”);

“`

5. 关闭不需要的文件描述符

精灵进程不需要与用户交互,因此可以关闭所有的输入输出文件描述符,以避免不必要的通讯开销。

可以使用以下代码关闭所有的文件描述符:

“`c

fclose(stdin);

fclose(stdout);

fclose(stderr);

“`

6. 开始执行任务

现在,精灵进程已经脱离控制终端、关闭了所有的文件描述符,并将工作目录设置为根目录。现在可以通过调用应用程序的主函数开始执行任务:

“`c

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

umask(0);

pid_t pid = fork();

if (pid) {

exit(0);

}

setsid();

chdir(“/”);

fclose(stdin);

fclose(stdout);

fclose(stderr);

// 调用主函数执行任务

return mn_fun(argc, argv);

}

“`

这段代码会通过fork()函数创建一个新的子进程,并调用主函数执行任务。子进程会在后台运行,并不会受到终端的影响。

本文介绍了如何使用C语言在Linux系统中创建一个简单的精灵进程。要创建一个真正稳定的精灵进程,还需要注意信号处理、资源管理等方面的细节。希望读者可以通过本文了解到精灵进程的基本概念和创建方法。

相关问题拓展阅读:

linux父进程创建两个子进程

LInux 父进程液州关闭宏辩子进程蔽埋缺

#include”stdio.h”

#include”stdlib.h” //exit包含在stdlib.h头文件中

#include”unistd.h”

int main(void)

{

pid_t pid1,pid2;

pid1=fork();

switch(pid1)

{

case 0: //进程创建成功,旅迹返回值为0

printf(“b”); //子进程1创建成功,输出b

break;

case -1:

printf(“Process creation failed\n”);//子进程创建失败,输出错误信息

break;

default:

printf(“a”);//此时执行父进程,启稿输出a

sleep(1);

exit(0);

break;

}

pid2=fork();

switch(pid2)

{

case 0: //进程创建成功,返回值为0

printf(“c”); //子进程2创建成功,输出c

break;

case -1:

printf(“Process creation failed\n”);//子进程创建失败,输出错误信息

exit(0);

break;

default:

printf(“a”);//此时执行悄镇孝父进程,输出a

//sleep(1);

exit(0);

break;

}

exit(0);

}

如何编写Linux Daemon后台程序?

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任 务。比如,作业规划进程crond,打印进程lpd等。 \x0d\x0a守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬 某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。 \x0d\x0a一. 守护进程及其特性 \x0d\x0a守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的 文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守 护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端 (通常是shell)执行。 \x0d\x0a总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果读者对进程有比较深入的认识就更容易理解和编程了。 \x0d\x0a二. 守护进程的编程要点 \x0d\x0a前面讲过,不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样,区别在于具体的实现细节不同。这个原则就是要满足守护 进程的特性。同时,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。编程要点如下; \x0d\x0a1. 在后台运行。 \x0d\x0a为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。 \x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//是父进程,结束父进程,子进程继续 \x0d\x0a2. 脱离控制终端,登录会话和进程组 \x0d\x0a有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 \x0d\x0a控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: \x0d\x0asetsid(); \x0d\x0a说明:当进程是会话组长时setsid()调用失败。但之一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 \x0d\x0a3. 禁止进程重新打开控制终端 \x0d\x0a现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: \x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//结束之一子进程,第二子进程继续(第二子进程不再是会话组长) \x0d\x0a4. 关闭打开的文件描述符 \x0d\x0a进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们: \x0d\x0afor(i=0;i 关闭打开的文件描述符close(i);> \x0d\x0afor(i=0;i \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0avoid init_daemon(void) \x0d\x0a{ \x0d\x0aint pid; \x0d\x0aint i; \x0d\x0a\x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//是父进程,结束父进程 \x0d\x0aelse if(pid \x0d\x0a#include \x0d\x0avoid init_daemon(void);//守护进程初始化函数 \x0d\x0amain() \x0d\x0a{ \x0d\x0aFILE *fp; \x0d\x0atime_t t; \x0d\x0ainit_daemon();//初始化为Daemon \x0d\x0awhile(1)//每隔一分钟向test.log报告运行状态 \x0d\x0a{ \x0d\x0asleep(60);//睡眠一分钟 \x0d\x0aif((fp=fopen(“test.log”,”a”)) >=0) \x0d\x0a{ \x0d\x0at=time(0); \x0d\x0afprintf(fp,”I’m here at %sn”,asctime(localtime(&t)) ); \x0d\x0afclose(fp); \x0d\x0a} \x0d\x0a} \x0d\x0a} \x0d\x0a以上程序在RedHat Linux6.0下编译通过。步骤如下: \x0d\x0a编译:gcc _g _o test init.c test.c \x0d\x0a执行:./test \x0d\x0a查看进程:ps _ef \x0d\x0a从输出可以发现test守护进程的各种特性满足上面的要求。

linux 创建精灵进程的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 创建精灵进程,Linux轻松创建精灵进程,linux父进程创建两个子进程,如何编写Linux Daemon后台程序?的信息别忘了在本站进行查找喔。


数据运维技术 » Linux轻松创建精灵进程 (linux 创建精灵进程)