linux下的fork和execve函数使用

fork函数是linux中创建进程的函数,linux创建进程只有用fork,别无他法。我自己写代码fork用的不多,对它的一些细节还不是清楚,今天抽空研究了下fork,把它的一些关键点总结一下,以后用到了自己也好有个参考。

1)fork函数会在父进程中创建子进程,子进程的堆,栈,数据段,PC指针都是从父进程中复制过来的,和父进程是独立的,但是内容是一致的。代码段子进程和父进程是共享的。

2)fork()的返回值可能为-1,0,和一个正数。-1表示fork()调用失败,0表示返回子进程执行结果,正数表示返回父进程结果(正数即为子进程ID)。

3)在fork的时候,缓存被复制到了子进程空间。这点可以详细参考http://coolshell.cn/articles/7965.html,我觉得这个帖子写的很好,很详细。

在进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。所以只要掌握了execve用法就可以了。这里我写了个例子,说明execve用法。

/*

*  execve.c

*/

#include<unistd.h>
int main()
{
   char * argv[ ]={"./test","test_sample",(char *)0};
   char * envp[ ]={0};
   execve("./test",argv,envp);

return 0;
}

/*

* test.c

*/

#include <stdio.h>
int main(int narg,char **args)
{

if(narg != 2)

{

printf("error,the input parameter must be one!\n");
       return -1;
   }
   char *str = args[1];
   printf("the input parameter is %s\n",str);
   return 0;
}

cc -g -o test test.c

生成test应用程序

然后

cc -g -o execve execve.c

生成execve应用程序

执行./execve即可调用test应用,输出

test_sample

linux下的fork和execve函数使用

时间: 2024-08-08 12:42:55

linux下的fork和execve函数使用的相关文章

Linux 下使用C语言 gets()函数报错

在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 fgets(cmd,100,stdin);//100为size 问题解决! fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符.读出的字符连同换行符存入缓冲区cmd中.返回指向cmd的指针. gets把从stdin中输入的一行信息存入cmd中,然后将换行符置换成串结

Linux下的目录扫描操作函数使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录扫描函数(scandir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录扫描  makefile  scandir 一.scandir命令简介 scandir函数的声明为: int scandir(const char *dir, structdirent ***namelist, int (*filter) (const void *b), int ( * compare )( co

Linux下的 fork 函数

之前只是了解到linux中的fork函数是用来创建进程,并没有太多的去学习,这里学习记录如下. 撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/44401389 本文来自 [jscese]的博客! 定义: 来自百科的解释:fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程.这两个进程中的线程继续执行,就像是两个用户同时启动了该应用程序的两个副本. 通俗的来理解,就是程序跑到f

关于linux下的fork()函数

上题 1. int main( ){ int i; for(i = 0; i<5;i++){ int pid = fork(); if(pid == 0){ //do something } else { //do something } } // do somthing,sleep return 0;}5101532 2 2.Linux下多少个"-"将被打印: int main(void){ int i; for(i=0;i<4;i++){ fork(); printf(

linux下使用fork,exec,waitpid模拟system函数

代码如下: #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> inline int mySystem(const char *cmd) { pid_t pid; if(cmd == NULL) return 1; int status; if

Linux下利用fork()创建子进程并使父进程等待子进程结束

int status; pid_t t = fork(); if(t){ waitpid(t, &status, 0); }else{ system("vi temp.txt"); exit(0); } //父进程和子进程均执行完毕后继续执行下去 分析过程: if 和 else 还是选择分支. 主要的原因是,fork() 函数调用一次,返回两次.两次返回的区别是:子进程的返回值是0,父进程返回值为新子进程的进程ID.返回后,父进程执行waitpid(t, &status

Linux下environ环境变量操作函数

#include <stdio.h> int main(int argc,char *argv[],char **envptr) { int i=0; for(i=0; envptr[i]!=NULL; i++) printf("%s\n",envptr[i]); return 0; } main函数是程序的入口函数,int main(int argc,char *argv[]); argc是程序参数的个数,argv保存参数 与下边的程序相同的功能 #include <

Linux下利用signal函数处理ctrl+c等信号

前言 linux下可以通过信号机制来实现程序的软中断,是一个非常有用的编程方法.我们平时在程序运行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候其实都等效于向这个进程发送了一个特定信号,当进程捕获到信号后,进程会被中断并立即跳转到信号处理函数.默认情况下一个程序对ctrl-c发出的信号(SIGINT)的处理方式是退出进程,所以当我们按下ctrl-c的时候就可以终止一个进程的运行. signal函数 但是有时候我们希望我们的程序在被信号终止之前执行一些特定的收尾流程,或者我们希望我

windows下的c语言和linux 下的c语言以及C标准库和系统API

1.引出我们的问题? 标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样.当时就有了疑问,因为我们非常清楚 其本质是不可能一样的,源于这是俩个操作系统啊!但由于c标准库的封装就实现了接口一样.但是如果往深入,我们就非常清楚了在这层封装上还有一层封装其实就是操作系统对文件操作的封装,也就是文件IO.而我们c语言的封装叫标准IO,他们有什么区别那?显然标准iO是基于文件io的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制. 2.上面