关于程序中调用cd和ls指令的问题,初学linux ,请大家帮忙!谢谢!
我想要实现的是在运行程序,输入指令(如cd ls之类)后 , 程序调用系统的cd ls指令输出相应内容.现在只能够传入一个字符串,这个问题不是关键的,我现在最大的问题是,我运行程序后,输入cd这个指令,总说找不到,
ls指令是可以找到的. 帮我看看是怎么回事,谢谢!
我运行cd和ls的结果是:
myclient >: cd
path= /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
buf=/root/bin6/bin/cd
can't find
myclient >: ls
path= /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
buf=/bin/ls
makefile myprogram pchar pchar.c pchar.d pchar.o/*该目录下面的文件*/
我调用指令 whereis 查看cd和 ls指令的位置,输出如下
whereis cd
cd: /usr/share/man/man1/cd.1.gz /usr/share/man/mann/cd.n.gz
whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz
源代码如下:
#include <string.h>
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
char buffer[128];
int is_command_exist (char *);
int main (int argc, char *argv[])
{
char input_buf[128];
int i, j, k;
int lc_input_len = 0;
char lc_char;
char bake_input[128];
char *arg[10];
int pid;
/*获取输入的字符串*/
while (1)
{
printf ("myclient >: ");
lc_char = getchar ();
while (lc_char != '\n' && lc_input_len < 128)
{
input_buf[lc_input_len++] = lc_char;
lc_char = getchar ();
}
if (lc_input_len > 128)
{
printf ("your input is too long! reinput\n");
lc_input_len = 0;
continue;
}
else
{
input_buf[lc_input_len] = '\0';
strcpy (bake_input, input_buf);
break;
}
}
for (i = 0, j = 0, k = 0; i <= lc_input_len; i++)
{
if (bake_input[i] == ' ' || bake_input[i] == '\t' || bake_input[i] == '\0')
{
if (j == 0)
continue;
else
{
input_buf[j++] = '\0';
arg[k] = (char *) malloc (sizeof (char) * j);
strcpy (arg[k], input_buf);
printf ("arg[%d] =%s ", k, arg[k]);
j = 0;
k++;
}
}
else
{
input_buf[j++] = bake_input[i];
}
}
/*调用shell的指令*/
if (is_command_exist (arg[0]) == -1)
{
printf ("can't find\n");
printf (" buf=%s\n", buffer);
exit(1);
}
printf (" buf=%s\n", buffer);
if ((pid = fork ()) == 0)
execv (buffer, arg);
else
waitpid (pid, NULL, 0);
for (i = 0; i < k; i++)
free (arg[i]);
return 0;
}
/*查看指令是否存在*/
int
is_command_exist (char *comm)
{
char *path, *p;
int i = 0, j = 0;
path = getenv ("PATH");
// printf (" path= %s \n", path);
p = path;
while (*(p + j) != '\0')
{
if (*(p + j) != ':')
buffer[i++] = *(p + j);
else
{
buffer[i++] = '/';
buffer[i] = '\0';
strcat (buffer, comm);
if (access (buffer, F_OK) == 0)
return 0;
else
i = 0;
}
j++;
}
return -1;
}
问题点数:20、回复次数:8Top
1 楼loveleijuforever(苦力)回复于 2005-04-28 18:16:28 得分 3
main()
{
int pid;
/* fork 子进程 */
pid=fork();
switch(pid) {
case -1:
perror("fork failed");
exit(1);
case 0:
execl("/bin/ls","ls","-l","--color",NULL);
perror("execl failed");
exit(1);
default:
wait(NULL);
printf("ls completed\n");
exit(0);
}
}
这样不就的了?用不着你那么麻烦吧Top
2 楼syncrow(天天)回复于 2005-04-28 18:38:02 得分 0
to loveleijuforever: 你好,是我没说清楚,我要做的是一个网络传输程序,由client方面把指令输入,指令是由用户输入的,所以用了前面的获取字符串的程序,的确,在我提的这个问题上是可以不用这段来获取的.
谢谢你!
我还是要在说一下我的问题是,我输入cd这个指令无法找到,
如果把你的程序该成cd指令的话,
#include <stdio.h>
main()
{
int pid;
/* fork 子进程 */
pid=fork();
switch(pid) {
case -1:
perror("fork failed");
exit(1);
case 0:
execl("/bin/cd","cd","-l","--color",NULL);
perror("execl failed");
exit(1);
default:
wait(NULL);
printf("ls completed\n");
exit(0);
}
}
在我的电脑上的执行结果是:
# ./get_cd
execl failed: No such file or directory
ls completed
你认为问题出在哪里?Top
3 楼gomo544409(gomo)回复于 2005-04-29 09:56:14 得分 3
ls 和 cd 好像都是bash的内嵌命令。 不存在于/bin或/sbin下面!
Top
4 楼gamedragon(gamedragon)回复于 2005-04-29 11:50:48 得分 4
cd和ls是shell命令,是shell执行的。Top
5 楼syncrow(天天)回复于 2005-04-29 12:23:58 得分 0
to gamedragon(gamedragon) :
是啊,在程序里面使用exec系列函数是可以调用的.
to gomo544409(gomo) ;
ls在/bin下面是有的,cd没有,不知道怎么调用cd?还是有可以实现类似功能的调用?
谢谢Top
6 楼schwarzenegger(找不到服务器)回复于 2005-04-30 17:03:37 得分 0
chdirTop
7 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2005-05-01 11:24:58 得分 5
chdir = cd
opendir readdir = ls
也可以 system("ls")Top
8 楼Dizovin(。握紧刀锋。。。)回复于 2005-05-12 11:25:52 得分 5
可以用system("命令")Top




