execvp() and/or strings 有问题,为什么这段代码不起作用?
Problems with execvp() and/or strings , why this code does not work?
我写了这段代码,它打开一个文件并执行文件的每一行,注释“#”除外:
我的文件:
ls -l
ls -a
cat /tmp/filex
代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void run(const char *cmd, const char *arg){
char *argv[3];
asprintf(&argv[0],"%s", cmd);
asprintf(&argv[1], "%s", arg);
argv[2] = NULL;
pid_t pid = fork();
if(pid == 0){
execvp(argv[0], (char * const *) argv);
perror("error: ");
exit(EXIT_FAILURE);
}
waitpid(pid, NULL, 0);
}
void scriptexec(FILE *fp){
char *line = NULL, *cmd = NULL, *arg=NULL, *delim=" \n\t";
size_t len = 0;
while(getline(&line, &len, fp) != -1){
cmd = strtok_r(line, delim, &arg);
if(cmd[0] != '#')
run(cmd, arg);
}
}
int main(int argc, char *argv[]){
if(argc < 2) exit(EXIT_FAILURE);
FILE *fp;
if((fp = fopen(argv[1], "r" )) == NULL) exit(EXIT_FAILURE);
scriptexec(fp);
fclose(fp);
return 0;
}
$ ./a.out 文件
我得到这个输出:
ls: invalid option -- '
'
Try 'ls --help' for more information.
ls: invalid option -- '
'
Try 'ls --help' for more information.
cat: /tmp/filex
: No such file or directory
我还尝试使用 运行() 函数编写另一个代码,它可以工作,没问题!
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void run(const char *cmd, const char *arg){
char *argv[3];
asprintf(&argv[0],"%s", cmd);
asprintf(&argv[1], "%s", arg);
argv[2] = NULL;
pid_t pid = fork();
if(pid == 0){
execvp(argv[0], (char * const *) argv);
perror("error: ");
exit(EXIT_FAILURE);
}
waitpid(pid, NULL, 0);
}
int main(){
run("ls", "-l");
}
看不懂...
ls: invalid option -- '
'
看到两个单引号。有一个新行被传递给 ls
,这确实是一个 "invalid option"。
getline()
returns 换行,输入已被触发。
如果在附近,就把它砍掉,然后再传递所读的内容。
为此你可以使用这个:
line[strcspn(line, "\r\n")] = '[=11=]';
我写了这段代码,它打开一个文件并执行文件的每一行,注释“#”除外:
我的文件:
ls -l
ls -a
cat /tmp/filex
代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void run(const char *cmd, const char *arg){
char *argv[3];
asprintf(&argv[0],"%s", cmd);
asprintf(&argv[1], "%s", arg);
argv[2] = NULL;
pid_t pid = fork();
if(pid == 0){
execvp(argv[0], (char * const *) argv);
perror("error: ");
exit(EXIT_FAILURE);
}
waitpid(pid, NULL, 0);
}
void scriptexec(FILE *fp){
char *line = NULL, *cmd = NULL, *arg=NULL, *delim=" \n\t";
size_t len = 0;
while(getline(&line, &len, fp) != -1){
cmd = strtok_r(line, delim, &arg);
if(cmd[0] != '#')
run(cmd, arg);
}
}
int main(int argc, char *argv[]){
if(argc < 2) exit(EXIT_FAILURE);
FILE *fp;
if((fp = fopen(argv[1], "r" )) == NULL) exit(EXIT_FAILURE);
scriptexec(fp);
fclose(fp);
return 0;
}
$ ./a.out 文件
我得到这个输出:
ls: invalid option -- '
'
Try 'ls --help' for more information.
ls: invalid option -- '
'
Try 'ls --help' for more information.
cat: /tmp/filex
: No such file or directory
我还尝试使用 运行() 函数编写另一个代码,它可以工作,没问题!
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void run(const char *cmd, const char *arg){
char *argv[3];
asprintf(&argv[0],"%s", cmd);
asprintf(&argv[1], "%s", arg);
argv[2] = NULL;
pid_t pid = fork();
if(pid == 0){
execvp(argv[0], (char * const *) argv);
perror("error: ");
exit(EXIT_FAILURE);
}
waitpid(pid, NULL, 0);
}
int main(){
run("ls", "-l");
}
看不懂...
ls: invalid option -- '
'
看到两个单引号。有一个新行被传递给 ls
,这确实是一个 "invalid option"。
getline()
returns 换行,输入已被触发。
如果在附近,就把它砍掉,然后再传递所读的内容。
为此你可以使用这个:
line[strcspn(line, "\r\n")] = '[=11=]';