我正在尝试通过父级获取命令并在不同的进程(子进程)中执行它。
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<malloc.h>
int main(){
pid_t pid = -1;
int status = -1;
char* ip = malloc(20);
char* a[20];
int pd[2];
char* path = NULL;
path = getenv("PATH");
printf("\n path : %s \n",path);
a[0] = malloc(10);
while(1){
pipe(pd);
pid = fork();
if(pid == 0){
//printf("\n Child! - pid : %d \n",getpid());
sleep(1);
close(pd[1]);
read(pd[0],ip,20);
a[0] = ip;
//execl(ip,ip,NULL);
execv(path,a);
exit(0);
}
else{
//printf("\n Parent! - pid : %d \n",getpid());
printf("(Enter a executable)$ ");
scanf("%s",ip);
//printf("\n %s \n",ip);
close(pd[0]);
write(pd[1],ip,20);
waitpid(pid,&status,0);
//printf("\n The child %d exited with status : %d \n",pid,status);
}
}
free(ip);
return 0;
}
路径和环境之间有什么区别。 getenv函数为我提供了可执行文件的完整路径。上述程序没有执行命令ls -l。
我想执行命令ls -l,输出应显示在屏幕上,并且应该存储在文件中。 我试着执行命令ls -l。但它没有执行。 有没有办法在文件输出时将ls -l输出到文件?
答案 0 :(得分:1)
是的,有一种方法可以同时输出到屏幕和文件,它被称为tee
。
ls -l | tee your_output_file
答案 1 :(得分:0)
您使用execv(path,a)
作为第一个参数运行path
,但您已将path
设置为PATH
环境变量的内容。 PATH
是shell搜索可执行文件的目录列表; execv
的第一个参数应该是要调用的可执行文件的路径。 (或者,execlp
和其他一些变体可以搜索`PATH``环境变量。)
您的代码还存在其他一些问题。看起来整个输入的内容被用作程序的名称(例如,它将查找具有五个字符名称“ls -l”的可执行文件),并且对于超过大约20个字符的命令将中断。