在Linux的编程下,在代码里经常会需要使用一些Linux的命令来完成某些特殊的功能,相对那些glibc的封装的函数,shell的命令总是方便好用,但是要是使用这些命令,自然也就离不开系统函数system,对于system的使用,网上的很多资料也特别说明了要慎用,但是,人总是不撞南墙不会头,前段时间,也因为对system的使用一知半解,所以导致了下面的问题的出现。
示例代码如下:
#include <stdlib.h>
#include <stdio.h>
#inluce <string.h>
int main()
{
char cmd[128] = {0};
strncpy(cmd, "mkdir text", 128);
system(cmd);
exit 0;
}
上述的示例代码在Linux环境编译运行是没有任何问题,但是在我的程序进程里怎么样都无法创建这个文件夹。有考虑的程序的权限,程序是否异常跳出没有执行该语句等等情况,但都证实不是这些原因导致的,在无奈之前,利用GDB调试,直接在该GDB该进程时调用system函数,发现返回值是-1,执行不成功,利用perror()打印错误显示内存不够。
在查阅了相关的资料后,发现system函数会在父进程下fork一个子进程,该子进程在需要写入的时候会拷贝一份和父进程一样大小的内存,这种现象叫做“写时拷贝”,但由于我的父进程的内存达到了1.9g,而运行的环境内存只有4g,在除去一些其他的后台进程,剩下的内存肯定不足1.9,所以导致了fork子进程失败,而system函数的执行必然失败。
在找到了相关的原因后,我打算将原来的调用system执行shell命令的函数替换成glibc的某些库函数实现,毕竟这是一个不定因素啊。
出现上述的问题,其实还是自己对系统的函数不熟悉,未来的程序猿之路还是很漫长的,但充满意思!!!
明日见。。。。。