免费注册 查看新帖 |

Chinaunix

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

关于unlink问题 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-18 19:34 |只看该作者 |倒序浏览
如何修改代码才能让shell执行之后删除临时文件


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>

  4. main()
  5. {
  6.     int fd,size;
  7.     char template[]="/tmp/template-XXXXXX";
  8.     char s[]="Linux Programmer1!\n";
  9.     char r[]="Linux Programmer2!\n";
  10.     fd=mkstemp(template);

  11.     write(fd,s,sizeof(s));
  12.     write(fd,r,sizeof(r));
  13.     execlp("cat","cat",template,(char *)0);
  14.     unlink(template);
  15.     close(fd);
  16. }
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
2 [报告]
发表于 2009-12-18 22:53 |只看该作者
自己测试了一下发现execlp执行完,后面的语句都不执行了,本人比较菜不知道是什么原因,但是感觉应该和c调用shell到标准输出有关,试想如果execlp用子进程
运行应该能解决,因为system()调用fork()执行shell,所以用system测试了一下,测试成功,好久没写c了(本人c也是初级阶段,见笑)fork的实验本人要搞的话
还需要一段时间,还是等待大侠们测试吧。不过希望具体的原理哪位大侠来总结一下比较好。



  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<unistd.h>
  4. #include<string.h>

  5. main()
  6. {
  7.     int fd,size;
  8.     char template[]="/tmp/template-XXXXXX";
  9.     char s[]="Linux Programmer1!\n";
  10.     char r[]="Linux Programmer2!\n";
  11.     char _Bash[]="cat ";
  12.     char c[strlen(template)+strlen(_Bash)];
  13.     fd=mkstemp(template);

  14.     write(fd,s,sizeof(s));
  15.     write(fd,r,sizeof(r));

  16.     strncat(c,_Bash,strlen(_Bash));
  17.     strncat(c,template,strlen(template));
  18.     system(c);

  19.     if (unlink(template) == 0)
  20.     {
  21.         printf("unlink OK\n");
  22.     }else
  23.     {
  24.         perror("unlink");
  25.     }
  26.     close(fd);
  27. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-12-18 23:39 |只看该作者
exec家族的这些函数是直接在父进程的空间里执行也就是会覆盖掉父进程后面的语句也就是你后面的unlink没有执行....
可以fork再在父进程里waitpid等待子进程结束

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
4 [报告]
发表于 2009-12-18 23:52 |只看该作者
是的,我上面的猜想就是用子进程的意思,但是没有测试,不知道兄台能否写个fork的代码供大家参考,我本意就是想用c获取一些内容写到文件,然后用shell  "cat filename | /usr/sbin/sendmail -t" 来发送邮件,也希望能给需要用c结合shell的和我一样的新人一点帮助。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-12-19 08:53 |只看该作者
> 我本意就是想用c获取一些内容写到文件,然后用shell  "cat filename | /usr/sbin/sendmail -t" 来发送邮件
你的思路根本就不对。

正确的做法是,假设你的程序是 foo,那么 foo 应该最多只做【用 C 获取一些内容】这件事,
连【写到文件】都最好不要做,直接打到屏幕就可以了,
然后:

/path/to/your/foo | sendmail -t

[ 本帖最后由 flw 于 2009-12-19 08:54 编辑 ]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
6 [报告]
发表于 2009-12-19 20:38 |只看该作者
原帖由 flw 于 2009-12-19 08:53 发表
> 我本意就是想用c获取一些内容写到文件,然后用shell  "cat filename | /usr/sbin/sendmail -t" 来发送邮件
你的思路根本就不对。

正确的做法是,假设你的程序是 foo,那么 foo 应该最多只做【用 C 获取一 ...


谢谢你的意见,但是我不太明白,我是不想把输出打印到屏幕,只是为了后台每小时执行发送邮件,为什么只让C做到读取数据,而不用C去写文件呢?原因是什么呢?本人可能比较笨,请指点一下。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2009-12-19 21:22 |只看该作者
原帖由 jxg945 于 2009-12-19 20:38 发表

谢谢你的意见,但是我不太明白,我是不想把输出打印到屏幕,只是为了后台每小时执行发送邮件,为什么只让C做到读取数据,而不用C去写文件呢?原因是什么呢?本人可能比较笨,请指点一下。

因为这样就可以很好地和 sendmail 结合,而不需要再 cat 一下。
而且还有很多很多你一时半会儿体会不到的好处。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
8 [报告]
发表于 2009-12-19 22:00 |只看该作者
原帖由 flw 于 2009-12-19 21:22 发表

因为这样就可以很好地和 sendmail 结合,而不需要再 cat 一下。
而且还有很多很多你一时半会儿体会不到的好处。


我可能明白你的意思了,你的意思用shell调用编译好的c程序(这块程序只处理数据的抓取),把C抓取的结果重定向到文件中。
是这样吗

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2009-12-19 22:02 |只看该作者
原帖由 jxg945 于 2009-12-19 22:00 发表

我可能明白你的意思了,你的意思用shell调用编译好的c程序(这块程序只处理数据的抓取),把C抓取的结果重定向到文件中。
是这样吗

对,这样从整体来看,更加健壮和灵活一些。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:51:16
10 [报告]
发表于 2009-12-19 22:09 |只看该作者
原帖由 flw 于 2009-12-19 22:02 发表

对,这样从整体来看,更加健壮和灵活一些。



我一开始没转过劲,总想着c调用shell,操作起来的确很麻烦。c读取大文件数据的确很有优势,但是小文件操作个人感觉还是shell比较方便些。非常感谢你的帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP