QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2275|回复: 5

execl()函数问题,帮忙!!

[复制链接]
发表于 2005-3-15 17:40:38 | 显示全部楼层 |阅读模式
我得程序是这样的:
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char buf[100];
        for ( ; ; ) {
                        fgets(buf,100,stdin);
                        if(strcmp(buf,"quit\n")==0)
                                       break;
                execl("/bin/sh","sh","-c",buf,(char *) 0);
                                printf("\n.....................\n");
                }
        exit(EXIT_SUCCESS);
}
如果不输入quit的情况下,程序应该是无限循环的,可是实际上程序却不执行printf("\n.....................\n");而直接退出,我搞了半天还没搞懂,请帮忙,谢谢。!!!
 楼主| 发表于 2005-3-15 17:48:55 | 显示全部楼层
而如果改成这样:
#include <stdio.h>
#include <stdlib.h>

int main()
{
        char buf[100];
        for ( ; ; ) {
        fgets(buf,100,stdin);
        if(strcmp(buf,"quit\n")==0)
                break;
        switch ( fork() ) {
                case -1:
                        _exit(0);
                case 0:{
                        execl("/bin/sh","sh","-c",buf,(char *) 0);
                        printf("\n.....................\n");
                        _exit(0);
                }
                default:
                        break;
        }
}
        exit(EXIT_SUCCESS);
}
那么可以进入无限循环,但是输入任意一个指令如:
ls -l   
然后用ps命令查看会发现如下提示:
22049 pts/3    00:00:00 ls <defunct>
而后每输入一个指令都会出现一个类似这样的死进程。
回复

使用道具 举报

发表于 2005-3-15 20:14:37 | 显示全部楼层
你这个break是跳出循环!!!!! !!
回复

使用道具 举报

 楼主| 发表于 2005-3-16 09:15:10 | 显示全部楼层
我想不是break 的问题,因为即使程序是这样也不行:
#include <stdio.h>
#include <stdlib.h>

int main()
{
char buf[100];
for ( ; ; ) {
fgets(buf,100,stdin);
execl("/bin/sh","sh","-c",buf,(char *) 0);
printf("\n.....................\n");
}
exit(EXIT_SUCCESS);
}
同样是执行完第一次输入就直接退出了,并且printf("\n.....................\n"); 就没有执行。我想,主要的问题应该在execl("/bin/sh","sh","-c",buf,(char *) 0); 这一句。
回复

使用道具 举报

发表于 2005-3-16 10:04:12 | 显示全部楼层
程序没有退出
是fgets要等待 回车!!!(起码 win下这样的)
回复

使用道具 举报

发表于 2005-3-18 10:01:53 | 显示全部楼层
关于 exec()系列的函数,执行完毕以后,是不会再回到原来的代码下行的!
你可以使用 fork()建立子进程,然后再执行命令,并且使用wait()函数等待子进程的结束.
这种方法 可以用system()或者popen()解决,不过听说会有安全上的问题.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 04:19 , Processed in 0.039187 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表