免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1565 | 回复: 9
打印 上一主题 下一主题

[Linux] Linux下代码问题求助!(守护进程有关) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-21 23:42 |只看该作者 |倒序浏览
详细问题是:我要做一个C语言可以挂载U盘的程序。。。。就是Linux下移除U盘但还没拔下来,
然后我用这段程序再次加载上去。。。。
但是这个不对。。。我测试了一下。。。。大概在close(i)这几行,但是去掉后达不到效果(不管用)。
错误在哪?这个功能又怎么实现?

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<stdlib.h>
#include<string.h>
#define MAX 65535
void init_daemon(void)
{
  int pid;
  int i,fds;
  if(pid=fork())
  exit(0); //是父进程,结束父进程
  else if(pid< 0)
  exit(1); //fork失败,退出
  //是第一子进程,后台继续执行
  setsid(); //第一子进程成为新的会话组长和进程组长
  //并与控制终端分离
   
  if(pid=fork())
  exit(0); //是第一子进程,结束第一子进程

  else if(pid< 0)
  exit(1); //fork失败,退出

  //是第二子进程,继续
  //第二子进程不再是会话组长

  chdir("/"); //改变工作目录到/tmp
  umask(0); //重设文件创建掩模
  for(i=0,fds=getdtablesize();i<fds;++i) //关闭打开的文件描述符
{
  close(i);
  printf("fds=%d\n",fds);
}
  printf("RRR\n");//test....
  return;
}
int main()
{
  char *look="fdisk -l | grep ^/dev/sd* > /mnt/.upan"; //????????
  FILE *fp;
  char str[9],str3[2];  
  char *tostr[5];
  int k=0,j=0;
  int i=0;
   

  init_daemon();//初始化为Daemon
  printf("here!\n");//test.....
  while(1)
  {
  //printf("xunhuan\n");
  if(j==0)
  if(system(look)==0)   
  {
  k=0;   
   
  if((fp=fopen("/mnt/.upan","r+"))!=NULL)
  {
  while(!feof(fp))   
  {  
  fgets(str3,2,fp);   
  if(str3[0]=='\n'|| str3[0]=='/')
  {
  if(k==5) break;   
  if(str3[0]=='/')
  fseek(fp,-1L,SEEK_CUR);   
  if(fgets(str,10,fp)!=NULL)   
  {   
  tostr[k]=(char*)malloc(sizeof(char)*10);
  strcpy(tostr[k],str);
  k++;
  }
  }
  }
  fclose(fp);
   
  for(i=0;i<k;i++)
  {
   
  char check[30]="/etc/init.d/mntusb ";
  char str1[30]="mount ",str2[20]=" /mnt/usb";
   
  strcat(check,tostr[i]+5);
  system(check);  
   
  strcat(str1,tostr[i]);
  strcat(str2,tostr[i]+5);
  strcat(str1,str2);   
   
  system(str1);
  free(tostr[i]);
   
  }
  j=1;
   
  } //if
   
  }//if
   
  if(system(look)!=0)  
  j=0;  
   
// printf("THERE\n");
  //sleep(3);   
  }//while
   
return 0;
}

论坛徽章:
0
2 [报告]
发表于 2012-10-22 00:09 |只看该作者
写个shell脚本更好吧,而且你用c实现,有必要创建daemon进程吗

论坛徽章:
0
3 [报告]
发表于 2012-10-22 12:28 |只看该作者
为什么不用守护进程呢?
我想让他一直执行
回复 2# rongpmcu


   

论坛徽章:
0
4 [报告]
发表于 2012-10-22 16:04 |只看该作者
回复 3# scuxc


    你的目的是: U盘弹出,但是没有手动拔掉,然后后端程序自动挂载? 没完全理解你的意思

论坛徽章:
0
5 [报告]
发表于 2012-10-23 11:38 |只看该作者
恩。对的
不过要想高版本的Ubuntu(10.4)那样,可以在桌面生成图表的那种
谢谢你哈!回复 4# rongpmcu


   

论坛徽章:
0
6 [报告]
发表于 2012-10-23 19:51 |只看该作者
回复 5# scuxc


    那就写个基于dbus的应用程序,然后用支持dbus的udev程序

论坛徽章:
0
7 [报告]
发表于 2012-10-23 21:59 |只看该作者
额。。。
可以再具体点吗?
谢谢!!回复 6# rongpmcu


   

论坛徽章:
0
8 [报告]
发表于 2012-10-23 22:09 |只看该作者
本帖最后由 rongpmcu 于 2012-10-23 22:11 编辑

回复 7# scuxc
我的意思是如果你想要在插拔U盘有事件通知的话,可以考虑dbus,不过也可以考虑下linux下自带的notify机制
我有一篇博客 linux下新硬盘的自动检测及格式化--支持硬盘的热插拔处理  用到了notify机制

   

论坛徽章:
0
9 [报告]
发表于 2012-10-23 23:01 |只看该作者
哦。。。。
好的,我现在还在学习中,问题可能比较simple哈!麻烦你了!
回复 8# rongpmcu


   

论坛徽章:
0
10 [报告]
发表于 2012-11-08 21:11 |只看该作者
studyddddd
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP