快速业务通道

LINUX进程控制(3)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-18
n hex =");

  scanf("%x",&key);

  //输入读写权限

  printf("Enter the operation permission mode in octal =");

  scanf("%o",&iMode);

  //输入创建标志

  printf("Enter create flags:\n"

  "No flags =0\n"

  "IPC_CREAT =1 \n"

  "IPC_CREAT and IPC_EXCL =2\n");

  printf("Flags = ");

  scanf("%d",&iFlag);

  //输出各参数值

  printf("key=0x%x,mode=0%o,flags=%d\n",

  key,iMode,iFlag);

  if(iFlag==0){

  iFlag=iMode|0;

  }else if(iFlag==1){

  iFlag=iMode|IPC_CREAT;

  }else{

  iFlag=iMode|IPC_CREAT|IPC_EXCL;

  }

  printf("IPC_CREAT:%x,iFlag:%x\n",IPC_CREAT,iFlag);

  //创建或打开消息队列

  if((iMsgQueId=msgget(key,iFlag))==-1){

  perror("msgget fail");

  return -1;

  }else{

  puts("msgget succeed.");

  return 0;

  }

  }

  5.6.2. 发送与接收消息

  发送和接收消息的函数原型:

  #include <sys/types.h>

  #include <sys/ipc.h>

  #include <sys/msg.h>

  int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

  ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);

  参数msgid指明消息队列的ID;

  参数msgbuf是消息结构体:

  struct msgbuf {

  long mtype; /* type of message */

  char mtext[1]; /* message text */

  };

  字段mtype是用户自己指定的消息类型,该结构体第2个成员仅仅是一种说明性的结构,实际上用户可以使用任何类型的数据;

  参数gsz是消息体的大小,每个消息体最大不要超过4K;

  参数msgflg可以为0或IPC_NOWAIT,如果设置IPC_NOWAIT,则msgsnd和msgrcv都不会阻塞,此时如果队列满并调用msgsnd,或队列空时调用msgrcv,将返回错误;

  参数msgtyp有3种选项:

  }

  return 0;

  }

  6. 守护进程(Daemon)

  守护进程(Daemon)是在后台运行不受终端控制的进程.比如各种网络服务器,如果web服务器,ftp服务器等.

  想要脱离所有终端的原因是守护进程可能是从终端启动,在这之后这个终端要能用来执行其它任务,或者关闭掉终端仍不影响已经启动的守护进程,简单一点的办法是启动的时候在命令行末尾加一个&符号,例如 nohup myserver.out&,但是也可以写代码将程序转成守护进程.

  变为守护进程可按照如下几步进行:

  在父进程重执行fork,并让父进程退出去,从而断开程序与终端的关联;

  在子进程中调用setsid();使新进程成为新的进程组组长和新会话期的领导;

  让根目录成为进程的工作目录,如果守护进程是从一个可挂接的文件系统中启动的话,如果不修改工作目录,在守护进程运行时,该文件系统就不能卸载;

  修改umask为0,避免在守护进程中创建的文件受到原有父进程的umask属性的影响;

  尽可能地关闭不需要的文件描述符.

  示例:

  #include <stdio.h>

  #include <stdlib.h>

  #include <unistd.h>

  #include <sys/stat.h>

  void BeDaemon()

  {

  const int MAXFD=64;

  if(fork()!=0) //脱离控制终端

  exit(0);

  setsid(); //成为新进程组组长和新会话领导

  chdir("/"); //设置工作目录为根目录

  umask(0); //重设文件访问权限掩码

  for(int i=0;i<MAXFD;i ) //尽可能关闭所有从父进程继承来的文件

  close(i);

  }

  int main()

  {

  int iLoop=0;

  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号