Linux系统删除/tmp/san.txt:两种C语言实现方案哪个更优?
哪种C语言删除文件的方案更好?
我需要删除/tmp/san.txt文件,目前有两种C语言实现方案,请问哪种方案更好?原因是什么?
方案一代码
int main(){ int status; pid_t pid = fork(); if(-1 == pid){ printf("fork() failed"); exit(EXIT_FAILURE); }else if(pid == 0){ execl("/bin/sh", "sh", "-c", "rm /tmp/san.txt", (char *) NULL); }else{ printf("[%d]fork with id %d\n",pid); waitpid(pid,&status,0); } return 0; }
方案二代码
int main(){ int ret = unlink("/tmp/san.txt"); if ( 0 == ret){ printf("file removed \n"); } return 0; }
毫无疑问,方案二是更优的选择,原因主要有这几点:
性能碾压级优势:方案一要走「创建子进程(fork)→ 加载shell程序(execl)→ shell解析并执行rm命令」一整套流程,每一步都有额外开销;而方案二直接调用
unlink()(底层是系统调用),一步到位完成文件删除,资源消耗小得多。可靠性拉满:方案一依赖系统里的shell环境(比如
/bin/sh是否存在、rm命令的路径是否正确),如果环境异常(比如嵌入式系统里没有完整shell),代码直接失效;而unlink()是标准POSIX接口,只要是符合POSIX标准的系统都能正常工作,依赖极少。代码简洁好维护:方案二逻辑一目了然,几行代码就完成核心功能;方案一涉及进程创建、子进程管理,逻辑更复杂,后续维护或者排查问题都更麻烦。
错误处理更直接:方案二可以通过
unlink()的返回值直接判断是否成功,还能通过errno拿到具体错误原因(比如文件不存在、权限不足);方案一得解析子进程的退出状态才能知道rm命令执行结果,过程繁琐且不够直观。
内容的提问来源于stack exchange,提问作者Sandeep_black
相关产品推荐
相关产品推荐

