system调用

在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的某些库函数实现,毕竟这是一个不定因素啊。
出现上述的问题,其实还是自己对系统的函数不熟悉,未来的程序猿之路还是很漫长的,但充满意思!!!
明日见。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值