一个守护进程实例美高梅手机登录网站

作者:电脑系统

用自己的话总结定义:

//重设文件创建掩模
umask(0);

输入重定向和输出重定向

//并与控制终端分离
if(pid=fork())
{
  exit(0);//是第一子进程,结束第一子进程
}
/*else if(pid<0)
{
  exit(1);//fork失败,退出
}*/

(输入重定向)

//是第一子进程,后台继续执行
setsid();//第一子进程成为新的会话组长和进程组长

dup2( int oldfd , int newfd )

//设置系统参数
struct rlimit l = {0,0};
l.rlim_cur=65535;
l.rlim_max=65535;
setrlimit(RLIMIT_NOFILE,&l);

               dup2(fd2,0);                execvp(argnext[0],argnext);                 if(remove("/tmp/youdonotknowfile"))                 printf("remove errorn");                 exit(0);         }

DaemonInit(void) { //LOG::INF("[ServerMeeting] 服务初始化.n"); int pid; //如果是父进程,结束父进程,子进程继续 if(pid=fork()) { exit(0); } /*else if(pid0)...

 if(pid == 0)             {                 if(!(find_command(arg[0])))                 {                     printf("%s:command not found",arg[i]);                     exit(0);                 }                fd=open(file,O_RDONLY);                 dup2(fd,0);                                                        execvp(arg[0],arg);                 exit(0);             }

close(fd);

(管道命令)

//信号处理
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP ,SIG_IGN);
signal(SIGTERM,SIG_IGN);

输入重定向和输出重定向的方法很相似,主要都是运用了dup2()这个函数:

//关闭打开的文件描述符,保留标准输入(0),标准输出(1)和标准错误输出(2)
//还可以将这3文件通过dup2重定向:error=open("/tmp/error",O_WRONLY|O_CREAT, 0600); dup2(error,2); close(error); //in=open("/tmp/in",O_RDONLY|O_CREAT,0600); if(dup2(in,0)==-1) perror("in"); close(in); //out=open("/tmp/out",O_WRONLY|O_CREAT,0600);if(dup2(out,1)==-1) perror("out"); close(out);
for(int fd=3,fdtablesize=getdtablesize();fd <fdtablesize;fd )
{

 

void DaemonInit(void)
{

(若以>输出到一个已经存在的文件中,那么文件就会被覆盖掉,如果想追加内容而不想删除原来文件的内容则可以用'>>')

}

dup2可以用参数newfd指定新文件描述符的数值,dup2调用成功,返回新的描述符。

//如果是父进程,结束父进程,子进程继续
if(pid=fork())
{
  exit(0);
}
/*else if(pid<0) // 不可能进入
{
  exit(1); //fork失败,退出
}*/

其实管道命令的实现方法也很简单,也运用了输入输出重定向

}

实现方法:

//LOG::INF("[ServerMeeting] 服务初始化.n");
int pid;

实现的方法就是将|左边的命令执行的结果保存至文件中,在运行|右边的命令时将再将刚刚文件中的内容传入|右边的命令去执行。

dup2(fd,0)同理,将文件符的值变为0,命令会从名为0的输入流中读取信息。

输出重定向:把运行>左边命令得出的结果输入到>右边的文件中。

(输出重定向)

(文件描述符0代表标准输入文件,一般就是键盘;  文件描述符1代表标准输出文件,一般是显示器;  文件描述符2代表标准错误输出,一般也指显示器 )

输入重定向:把<右边的文件的内容输入到<左边的命令中。

dup2(fd,1)的意思就是把文件描述符替换为1,因为执行命令得到的结果是会向名为1的输出流中输出得到的结果,现在将文件描述符的数值变为1,执行命令后自然就会将结果输入到文件中了。

管道命令:a|b,a和b分别是两个命令,执行a命令后得到的结果可以被b接受,b命令继续对结果进行相应的处理。

if(pid == 0)             {                 if(!(find_command(arg[0])))                 {                     printf("%s:command not found",arg[i]);                     exit(0);                 }                、 fd=open(file,O_RDONLY);                     dup2(fd,0);                                                             execvp(arg[0],arg);                     exit(0);             }

if(pid == 0)             {                 int pid2;                 int status2;                 int fd2;                 if((pid2 =fork()) < 0)                 {                    printf("fork2 errorn");                     return;                 }                 else if(pid2 == 0)                 {                     if(!(find_command(arg[0])))                     {                        printf("%s :command not foundn",arg[0]);                         exit(0);                     }                     fd2 = open("/tmp/youdonotknowfile",O_WRONLY|O_CREAT|O_TRUNC,0644);  //创建临时文件保存管道符前面的操作                     dup2(fd2,1);                                                                            execvp(arg[0],arg);                                                                      exit(0);                 }         、        if(waitpid(pid2,&status2,0) == -1)                                                                          //确保管道符前的操作先执行完成                 printf("please wait process errorn");
                if(!(find_command(arg[i])))                {                     printf("%s :command not foundn",arg[0]);                     exit(0);               }                 fd2 = open("/tmp/youdonotknowfile",O_WRONLY|O_CREAT|O_TRUNC,0644);                     

 

近期,通过实现shell了解了输入重定向,输出重定向,管道-

本文由美高梅4858官方网站发布,转载请注明来源

关键词: