将用户 C 字符串输入到 c 中的 exec() 函数中
Getting user C String input into exec() function in c
这是一般问题:
该程序必须 fork()
和 wait()
才能使 child 完成。
child 将 exec()
另一个名称由用户输入的程序。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void) {
int status;
char input[BUFSIZ];
printf(">");
scanf("%s",input);
char *args[] = {"./lab1"};
pid_t pid = fork();
if(pid==0){
execvp(args[0],args);
}else if(pid<0){
perror("Fork fail");
}else{
wait(&status);
printf("My Child Information is: %d\n", pid);
}
return 0;
}
我的问题是让用户向 运行 输入一个程序名称(在“>”提示符下)并将该输入输入到 execvp(或另一个 exec() 函数,如果有人有任何想法)
我暂时不会责备你使用 scanf("%s")
,但你应该知道它真的不是 robust code。
你的基本任务是获取用户输入的字符数组,并以某种方式将其转换为适合传递给 execvp
.
的字符指针数组
您可以使用 strtok
将输入字符串标记为由空格分隔的标记,并使用 malloc/realloc
确保数组中有足够的元素来存储字符串。
或者,由于您已经存在潜在的缓冲区溢出问题,因此使用固定大小的数组可能就足够了。
例如,下面的程序展示了一种方法,它使用固定字符串 echo my hovercraft is full of eels
并将其标记为适合执行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static char *myStrDup (char *str) {
char *other = malloc (strlen (str) + 1);
if (other != NULL)
strcpy (other, str);
return other;
}
int main (void) {
char inBuf[] = "echo my hovercraft is full of eels";
char *argv[100];
int argc = 0;
char *str = strtok (inBuf, " ");
while (str != NULL) {
argv[argc++] = myStrDup (str);
str = strtok (NULL, " ");
}
argv[argc] = NULL;
for (int i = 0; i < argc; i++)
printf ("Arg #%d = '%s'\n", i, argv[i]);
putchar ('\n');
execvp (argv[0], argv);
return 0;
}
然后它输出标记化的参数并执行它:
Arg #0 = 'echo'
Arg #1 = 'my'
Arg #2 = 'hovercraft'
Arg #3 = 'is'
Arg #4 = 'full'
Arg #5 = 'of'
Arg #6 = 'eels'
my hovercraft is full of eels
这是一般问题:
该程序必须 fork()
和 wait()
才能使 child 完成。
child 将 exec()
另一个名称由用户输入的程序。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void) {
int status;
char input[BUFSIZ];
printf(">");
scanf("%s",input);
char *args[] = {"./lab1"};
pid_t pid = fork();
if(pid==0){
execvp(args[0],args);
}else if(pid<0){
perror("Fork fail");
}else{
wait(&status);
printf("My Child Information is: %d\n", pid);
}
return 0;
}
我的问题是让用户向 运行 输入一个程序名称(在“>”提示符下)并将该输入输入到 execvp(或另一个 exec() 函数,如果有人有任何想法)
我暂时不会责备你使用 scanf("%s")
,但你应该知道它真的不是 robust code。
你的基本任务是获取用户输入的字符数组,并以某种方式将其转换为适合传递给 execvp
.
您可以使用 strtok
将输入字符串标记为由空格分隔的标记,并使用 malloc/realloc
确保数组中有足够的元素来存储字符串。
或者,由于您已经存在潜在的缓冲区溢出问题,因此使用固定大小的数组可能就足够了。
例如,下面的程序展示了一种方法,它使用固定字符串 echo my hovercraft is full of eels
并将其标记为适合执行:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static char *myStrDup (char *str) {
char *other = malloc (strlen (str) + 1);
if (other != NULL)
strcpy (other, str);
return other;
}
int main (void) {
char inBuf[] = "echo my hovercraft is full of eels";
char *argv[100];
int argc = 0;
char *str = strtok (inBuf, " ");
while (str != NULL) {
argv[argc++] = myStrDup (str);
str = strtok (NULL, " ");
}
argv[argc] = NULL;
for (int i = 0; i < argc; i++)
printf ("Arg #%d = '%s'\n", i, argv[i]);
putchar ('\n');
execvp (argv[0], argv);
return 0;
}
然后它输出标记化的参数并执行它:
Arg #0 = 'echo'
Arg #1 = 'my'
Arg #2 = 'hovercraft'
Arg #3 = 'is'
Arg #4 = 'full'
Arg #5 = 'of'
Arg #6 = 'eels'
my hovercraft is full of eels