Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c语言实现tar命令_C_Linux_Tar - Fatal编程技术网

用c语言实现tar命令

用c语言实现tar命令,c,linux,tar,C,Linux,Tar,我正在尝试使用C创建linux“tar”命令的基本版本,我使用perror查看在执行过程中是否有任何错误,我得到了这个结果 ./tar Error2: Bad file descriptor 这就是我到目前为止所做的 #include <stdio.h> #include <libtar.h> #include <fcntl.h> int main(void) { TAR *pTar; char *prefix = "."; char *

我正在尝试使用C创建linux“tar”命令的基本版本,我使用perror查看在执行过程中是否有任何错误,我得到了这个结果

./tar
Error2: Bad file descriptor
这就是我到目前为止所做的

#include <stdio.h>
#include <libtar.h>
#include <fcntl.h>

int main(void)
{
   TAR *pTar;
   char *prefix = ".";
   char *filename = "file.tar";

   if ((tar_open(&pTar, filename, NULL, O_WRONLY, 0644, TAR_GNU)) == -1)
     perror("Error1");
   else if ((tar_extract_all(pTar, prefix)) == -1)
     perror("Error2");
   else if ((tar_close(pTar)) == -1)
     perror("Error3");
}
#包括
#包括
#包括
内部主(空)
{
焦油*pTar;
字符*前缀=”;
char*filename=“file.tar”;
if((tar_open(&pTar,filename,NULL,O_WRONLY,0644,tar_GNU))=-1)
perror(“错误1”);
else if((tar\u extract\u all(pTar,前缀))=-1)
perror(“错误2”);
否则如果((tar_close(pTar))=-1)
perror(“错误3”);
}

提前感谢:)

您正在以
O_WRONLY
模式打开
tar
文件,因此它会截断现有文件,而不是将其打开进行读取

当您尝试从文件中提取时,会出现错误(可能是在读取头时),这是意料之中的,因为文件内容被上一次(成功)调用破坏

请在此处查看工作示例:

  • 读取一个tar文件:。他们只使用
    O\u rdon
  • 创建tar文件:。看起来像你的代码,只是它是用来写的,不是用来读的
总而言之,我的解决办法是:替换

if ((tar_open(&pTar, filename, NULL, O_WRONLY, 0644, TAR_GNU)) == -1)


(我不认为所有参数在读取模式下都有用,比如权限或tar类型,但这应该是可行的,很难为该库找到合适的示例)

您在
O_WRONLY
模式下打开
tar
文件,因此它会截断现有文件,而不是打开它进行读取

当您尝试从文件中提取时,会出现错误(可能是在读取头时),这是意料之中的,因为文件内容被上一次(成功)调用破坏

请在此处查看工作示例:

  • 读取一个tar文件:。他们只使用
    O\u rdon
  • 创建tar文件:。看起来像你的代码,只是它是用来写的,不是用来读的
总而言之,我的解决办法是:替换

if ((tar_open(&pTar, filename, NULL, O_WRONLY, 0644, TAR_GNU)) == -1)


(我不认为所有参数在读取模式下都有用,比如权限或tar类型,但这应该是可行的,很难为该库找到合适的示例)

对于将来引用该库的任何人

在创建tar时,请说abc.tar 如果您已经附加了abc.tar(它也在同一目录中,并且append_树附加了所有文件,包括一个),那么您的abc.tar文件在tar_extract_all上,这个.tar文件(具有相同的名称)也会被提取出来,覆盖原始的tar文件

至少这就是为什么我会有这种神秘的“无效的争论”。
我通过在提取之前重命名原始文件来修复它。

对于将来引用此文件的任何人

在创建tar时,请说abc.tar 如果您已经附加了abc.tar(它也在同一目录中,并且append_树附加了所有文件,包括一个),那么您的abc.tar文件在tar_extract_all上,这个.tar文件(具有相同的名称)也会被提取出来,覆盖原始的tar文件

至少这就是为什么我会有这种神秘的“无效的争论”。
我通过在提取之前重命名原始文件来修复它。

显示完整的错误消息和/或在调试模式下运行它以向我们显示错误发生的行。显示完整的错误消息和/或在调试模式下运行它以向我们显示错误发生的行。我尝试使用O_RDONLY模式,而不是“错误的文件描述符”错误显示“无效参数”错误。文件大小未更改,已尝试使用普通tar提取其内容,并且一切仍然安全。我确保该文件与可执行文件位于同一目录中,并将给定路径替换为绝对路径,但仍然显示相同的错误。最后,似乎不止您一人:。如果((tar_open(&pTar,filename,NULL,O_RDONLY,0,tar_VERBOSE))==-1)(无tar_GNU,并添加VERBOSE以获得调试输出)我尝试使用O_RDONLY模式,而不是“坏文件描述符”错误,它显示“无效参数”错误。文件大小没有改变,尝试使用普通tar提取其内容,但一切仍然安全我确保该文件与可执行文件位于同一目录中,并将给定路径替换为绝对路径,但仍然显示相同的错误。最后似乎不止您一人:。看起来是相同的问题。是否可以尝试
如果((tar_open(&pTar,filename,NULL,O_RDONLY,0,tar_VERBOSE))==-1)
(无tar_GNU,并添加VERBOSE以获得调试输出)