我正在用c语言进行Shell命令执行模拟。
我试图将execvp函数的输出重定向到一个文件中。当打印到终端时,输出看起来正常,但是当试图将其重定向到一个txt文件时,在创建的output.txt文件中没有可见的输出。
代码如下:
int file = open("output.txt", O_WRONLY | O_CREAT);
if (file == -1) {
perror("open");
exit(EXIT_FAILURE);
}
if (dup2(file, STDOUT_FILENO) == -1) {
perror("dup2");
exit(EXIT_FAILURE);
}
char* command1= "grep";
char* myList[]={"grep", "URL", NULL};
close(file);
execvp(command1, myList);
perror("execvp");
exit(EXIT_FAILURE);
发现解决方案:
这个问题显然是因为我忘记关闭管道的读写端。
我应该加上:
close(fd[0]);
close(fd[1]);
使用dup2函数后。
感谢所有试图帮助我的人,尽管我的问题无法通过我提供的信息解决。
int file = open("output.txt", O_WRONLY | O_CREAT);
是不正确的
您没有正确设置文件的权限位,因此以后使用该文件可能会导致问题。
创建文件时,open()
需要mode
参数:
简介
#include <sys/stat.h> #include <fcntl.h> int open(const char *path, int oflag, ...);
…
O_CREAT
如果文件存在,这个标志没有作用,除了下面O_EXCL下的说明。否则,如果不设置O_DIRECTORY,则将文件创建为常规文件;文件的用户ID设置为进程的有效用户ID;文件的组ID设置为文件父目录的组ID或进程的有效组ID;和文件模式的访问权限位(参见)设置为
mode_t
类型oflag
参数后面的参数的值,修改如下:对文件模式位及其对应的进程文件模式创建掩码补码位进行位与运算。因此,清除文件模式中与文件模式创建掩码中所设置的位相对应的所有位。当设置文件权限位以外的位时,效果是不确定的。oflag参数后面的参数不会影响文件是为读、写还是同时为读、写打开。实现应该提供一种方法将文件的组ID初始化为父目录的组ID。实现可以(但不需要)提供一种实现定义的方法来将文件的组ID初始化为调用进程的有效组ID。
不是
int file = open("output.txt", O_WRONLY | O_CREAT);
你可能应该有这样的内容:
int file = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644 );
当前的output.txt
文件可能有一些奇怪的权限,可能会导致问题。删除该文件,并更新代码,以确保该文件是在受控制的权限下创建的。