当前位置: 技术问答>linux和unix
linux下 system问题 高手进~ 100分
来源: 互联网 发布时间:2016-06-22
本文导语: 最近遇到一个问题,我的一个linux进程(非常大,占用机器70%的内存),在进程运行过程中,我想执行一个shell命令,起初是调用system("shell命令"),但是system会fork一个子进程来完成这个操作,但是这时内存已经不够用(...
最近遇到一个问题,我的一个linux进程(非常大,占用机器70%的内存),在进程运行过程中,我想执行一个shell命令,起初是调用system("shell命令"),但是system会fork一个子进程来完成这个操作,但是这时内存已经不够用(不足以复制出新的子进程), 请问各位牛人,怎么办,什么手段都行。
|
试试vfork,然后直接exec?
|
帮顶,学习
|
这种情况下用vfork基本上是OK的。
如果还不行,可能要想办法释放一些父进程占有的一些资源了。
如果还不行,可能要想办法释放一些父进程占有的一些资源了。
|
#include
了吗?
了吗?
|
exec是shell命令,它包含一组函数接口,execve是其中的一个,看下面的例子吧:
/****************************************************************************
**
** execve.c--Illustrate the usage of execve
**
*****************************************************************************/
#include
#include
#include
int main( void )
{
char* args[] = { "/bin/ls", NULL };
if ( -1 == (execve("/bin/ls", args, NULL)) )
{
perror( "execve" );
exit( EXIT_FAILURE);
}
puts( "shouldn't get here" );
exit( EXIT_SUCCESS );
}
[root@localhost src]# gcc execve.c
[root@localhost src]# ./a.out
a.out child_fork.c execve.c fork.c getpid.c
/****************************************************************************
**
** execve.c--Illustrate the usage of execve
**
*****************************************************************************/
#include
#include
#include
int main( void )
{
char* args[] = { "/bin/ls", NULL };
if ( -1 == (execve("/bin/ls", args, NULL)) )
{
perror( "execve" );
exit( EXIT_FAILURE);
}
puts( "shouldn't get here" );
exit( EXIT_SUCCESS );
}
[root@localhost src]# gcc execve.c
[root@localhost src]# ./a.out
a.out child_fork.c execve.c fork.c getpid.c
|
偶指的是exec系列函数。:P
包括:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
包括:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
|
fork(vfork)+exec系列
或者system。
在代码里调用shell指令,应该没有其他办法了。
或者system。
在代码里调用shell指令,应该没有其他办法了。
|
如果命令位于环境变量PATH所指定的某个路径中,那么使用那两个带p结尾的函数都可以找到。
另外,你也可以在exec函数中把主命令指定为“/bin/sh”,再加一个“-c”参数,然后将你原来的命令(甚至带有IO重定向的命令字符串)直接作为sh的参数,这样最简单。
|
比如:
const char cmd = "ls > a.txt";
execl("/bin/sh", "sh", "-c", cmd, (char*)0);
const char cmd = "ls > a.txt";
execl("/bin/sh", "sh", "-c", cmd, (char*)0);
|
man vfork
It is rather unfortunate that Linux revived this specter(fork) from the past.
在2.6上,vfork已经没有存在的必要了
你应该重新考虑你那个占用70%内存的程序,设计上肯定有问题
It is rather unfortunate that Linux revived this specter(fork) from the past.
在2.6上,vfork已经没有存在的必要了
你应该重新考虑你那个占用70%内存的程序,设计上肯定有问题
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。