我正在研究一个C程序。我无法打开文件并覆盖它是否存在。我认为代码是正确的,而是附加代码。
int in, out, append ,pid;
if (sc->infile)
{
in = 1;
printf("infile");
}
if (sc->outfile){
out = 1;
printf("outfile");
}
if (sc->append)
append = 1;
if ((pid = fork()) < 0)
perror("some erro");
else if (pid == 0)
{
/* Be childish */
if (in)
{
int fd0 = open(sc->infile, O_RDONLY);
dup2(fd0, STDIN_FILENO);
close(fd0);
}
if (out)
{
printf("outfile detece");
int fd1;
if (append)
fd1 = open(sc->outfile, O_WRONLY | O_CREAT | O_APPEND, 0666);
else
fd1 = open(sc->outfile, O_WRONLY | O_CREAT , 0666);;
dup2(fd1, STDOUT_FILENO);
close(fd1);
}
execvp(sc->argv[sc->cmdStart[0]], &(sc->argv[sc->cmdStart[0]]));
fprintf(stderr, "Failed to exec\n" );
exit(1);
}
else
{
/* Be parental */
wait(0);
}
有人可以帮忙吗?我已经尝试了很多来解决这个问题。
答案 0 :(得分:1)
声明
outputFd = open(sc->outfile, O_WRONLY | O_CREAT , 0666);
似乎正确,只需确保sc->outfile
正确无误。您是否打印了open()
或perror("open()")
所说的返回值。
来自open
返回值
open()和creat()返回新的文件描述符,如果出错则返回-1 发生了(在这种情况下,errno设置得恰当)。
同时打印errno
。例如
int outputFd;
outputFd = open(sc->outfile, O_WRONLY | O_CREAT , 0666);
if(outputFd == -1) {
/* Error handling */
}
它是否会附加?不,您提到的代码快照无法实现。如果您可以使用O_APPEND
。
答案 1 :(得分:1)
in
,out
,append
未初始化为零,因此会导致问题。
将申报行更改为
int in = 0, out = 0, append = 0, pid;