① linux中system和exec函数的区别
system是用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替用来的程序运行。
system 是在单独的进程中执行命令,完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了。
看一下,下面的例子.
例子1
---------------------------------
system("your_program");
printf("You can see me! ");
---------------------------------
例子2
---------------------------------
exec("your_program");
printf("You can't see me! ");
---------------------------------
在例子1中,在你的程序执行完毕以后,会执行printf语句。
在例子2中,由于exec将程序your_program代替了本身,因此程序不再会执行printf语句。
在Linux下,exec通常会和fork语句一起用。
看下面的这个例子
--------------------------------------------
pid_t pid = fork();
if (pid < 0) {
printf(“fork error!”);
exit(-1);
} else if (pid == 0) {
//这里是子进程
printf("I'm son! ");
//执行其它的程序
exec("your_program");
} else {
//这里是父进程
printf("i'm father!");
wait();//等待子进程结束后返回
exit(0);
}
② linux shell脚本 解释exec
判断/var/log/x.log文件是否为空
如果为空,则将exec的操作结果放入/var/log/x.log中
exec应该是一个命令,但是这边这个语法没有意义
③ 关于Linux的shell的exec命令
wall是向所有登录系统的用户发送信息,消息的内容是 "Thanks for all the fish" , 相当于短信群发。
exec 3<afile 打开文件afile,文件描述符是3,然后这个3就可以代表文件afile,比如
cat <&3 查看文件afile的内容
④ linux中fork,source和exec的区别
fork是系统调用,用来创建子进程。
source 读取函数,读取配置文件的时候用,不创建子进程,也是'.'
exec是创建进程,但是是创建的进程取代原来的进程,
所以fork是继承皇位,exec是推翻皇朝;
比如安卓系统中:就是用exec进行rootfs切换的;因为他用的是busybox,所以真假rootfs之间的切换用exec的;
⑤ linux 系统中execl的作用是
intexecl(constchar*path,constchar*arg,...);
是系统提供的接口函数
execl是exec函数族中的一员
exec族函数的功能是加载一个新的程序替换掉当前的进程
它可以调用一个外部程序到当前的进程空间里
但不会产生一个新的进程(它只是将当前进程的映像替换成新加载的程序的映像)
可以写一个程序清楚地看到
d.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
return0;
}
f.c
#include<stdio.h>
#include<unistd.h>
intmain(intargc,char**argv)
{
printf("pid=%dppid=%d ",getpid(),getppid());
execl("./d","d",NULL);
return0;
}
在未执行execl调用之前和执行execl之后pid和ppid完全相同
由此可见execl并没有创建新的进程
⑥ linux进程通信 中的exec问题
哪里写的这些...好乱阿..
先解释下基本的:
int main(argc,char * argv[])
main的参数,就是命令行参数.
比如你的可执行文件是test,你希望在程序执行时传入IP地址,那么可以这样:
./test 127.0.0.1
此时,argc =1,argv[1]是就是指向"127.0.0.1"指针(命令参数全部当作字符串来处理的)。
而 argv[0]就代表第一个参数,这里对应的就是"./test"。
argc和argv在mian里面都是可以使用的,出了main的范围就不能使用了。
再来说你提出的第一个地方,exec的问题。
exec实际上包含了一组函数,execl, execlp, execle, execv, execvp, execvpe
具体使用方法,你man execv就可以得到这些函数的使用方法。
exec函数的作用是,产生一个新进程,结束当前进程(具体执行的操作是复制当前进程的一部分数据和权限,然后根据参数启动一个新的进程)。
exec这组函数执行时候,需要提供的参数包括:一个可执行程序的路径,传递给可执行程序的参数。(这里的参数,与刚才说到的main的参数含义相同。)
说到这里应该明白了吧...就一个。
我不知道你要hello world干什么...照你意思给写了个.
第一个,就是你贴出来的代码改动一点点(我这边运行有点问题):
#include <stdio.h>
main(int argc,char* argv[])
{
int i=0
while(i<=argc)
{
printf("arguement %d : %s ",i,argv[i]);
printf("\n");
i++;
}
}
运行程序:
$gcc test.c -o test
$./test hello world
输出结果:
[ksl@myhost WGX]$ ./test hello world
Arguement 0:./test
Arguement 1:hello
Arguement 2:world
Arguement 3:(null)
然后第二个,使用exec的例子,我用execl吧..
文件名是test1.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void main(int argc,char *argv[])
{
printf("This is not exec...");
execl("./test","hello","world",NULL);
//如果exec执行正常,下面的printf将不会被执行
//因为当前进程已经结束,./test将被执行
printf("exec error");
}
输出结果:
[ksl@myhost WGX]$ ./test1
Arguement 0:hello
Arguement 1:world
Arguement 2:(null)
后者并没输出"./test"....就是exec启动的程序,其命令行参数中只有参数.(我也不晓得原因...=.=||)
⑦ linux下exec函数不返回结果
yes you are right , exec 是不返回的,它将当前进程的内容替换成要执行的程序的内容,这样就可以运行一个新的程序了。如果exec 返回了说明执行新程序出错了,内存不够啊,系统异常啊。。
⑧ linux exec命令主要用来干什么的啊
从外部看是执行一个外部程序,从内部看是开启一个进程来执行目标程序。