我是学生开发人员,也是C语言的初学者。我有一个任务,我没有找到一个明确的解决办法,根据我的水平。我想在子进程中运行exec()函数。我使用fork()创建了父级和子级。没问题的。但是我的代码只是运行命令,比如ls , pwd等等。如果我想编写ls -l,它不会像那样运行命令。我该怎么办?在这个问题上你能帮我吗?
我的ls输出:
最小二乘法 a.out main.c 2006152毫秒
我对ls -l的输出
ls -l Error exec:没有这样的文件或目录 3627824毫秒
我的代码是:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define N 100
void ChildProcess ();
void ParentProcess ();
struct timeval start, end;
int main () {
gettimeofday (&start, NULL);
pid_t pid;
pid = fork ();
if (pid == 0){
ChildProcess ();
}
else {
wait (NULL);
ParentProcess ();
}
return 0;
}
void ChildProcess () {
char input[N];
scanf (" %[^\n]s", input);
if (execlp (input, "", (char *) 0) < 0){
perror ("Error exec");
exit (0);}
}
void ParentProcess () {
gettimeofday (&end, NULL);
printf ("%ld %s \n", ((end.tv_sec * 1000000 + end.tv_usec)-(start.tv_sec * 1000000 + start.tv_usec)), "ms");
} 发布于 2019-10-19 23:07:55
您的问题是,所有exec()家族函数只期望可执行名称作为第一个参数(没有任何参数)。然后根据您决定调用的exec函数传递参数。在execlp()的情况下,所有参数(包括可执行名称)都作为以空结尾的列表传递。
实际上,您希望以这样的方式调用您的函数:
execlp ("ls", "ls", "-l", (char *) 0);这样做的方法是将空间字符上的input字符串拆分(使用strtok()),并将结果保存在不同的变量中。
如果您想处理多个参数的情况,那么就不能通过使用execlp()来实现它。使用execvp()代替相应的修改。您可以找到所有exec()函数的手册页( 这里 ),这将为您提供足够的信息。
https://stackoverflow.com/questions/58468505
复制相似问题