将date命令的输出读入C脚本Unix中的变量中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将date命令的输出读入C脚本Unix中的变量中相关的知识,希望对你有一定的参考价值。
我必须将date
命令(Unix)输出的内容作为字符串存储到变量中,然后将其写入子进程的管道中。最后,使用管道在父进程中输出它。到目前为止,这是我尝试过的:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int channel[2];
if(pipe(channel) == -1) { printf("Eroare la crearea pipe ului!
"); return 1; }
pid_t pid = fork();
if(pid < 0) { printf("Eroare la crearea procesului
"); }
else if(pid > 0)
{
wait(NULL); // wait for the child to write to the pipe
close(channel[1]); // close not-needed side of pipe
char *aux;
read(channel[0], aux, sizeof(channel[0]));
printf("Sirul citit este: '%s'
", aux);
close(channel[0]);
// exit(0);
}
else
{
close(channel[0]);
// char *data_acum = (char*)system("date");
char *data_acum = system("date");
printf("variabila `data_acum` are valoarea '%s'
", data_acum);
// printf(typeof(data_acum));
write( channel[1], data_acum, sizeof(data_acum) );
// write( channel[1], system("date"), sizeof(system("date")) );
// exit(0);
}
return 0;
}
输出:
Thu Apr 30 02:05:39 EEST 2020
variabila `data_acum` are valoarea '(null)'
Sirul citit este: '1I^HHPTLz'
更具体地说,我的问题是:
我试图弄清楚为什么此行char *data_acum = system("date")
或注释的行//char *data_acum = (char*)system("date")
无法正常工作;通过“工作”,如果我直接在命令行中使用date
,我希望存储它会显示的字符串。此system("date")
是否不返回我可以存储在type const char*
变量中的字符串?
[另外,我也不是100%知道警告要说的内容:warning:initialization makes pointer from integer without a cast [-Wint-conversion]
。我知道类型之间存在一些不兼容,但是system("date")
是否实际上返回了int
?因此,我试图以某种方式将其转换为const char*
吗?我记得看到过一些有关日期实际上是十六进制数字的信息。
很抱歉,问了太多问题!最后,总结一下我的问题:system("date")
返回什么,如何解决我的问题?
预期输出:
Thu Apr 30 02:05:39 EEST 2020
variabila `data_acum` are valoarea 'Thu Apr 30 02:05:39 EEST 2020'
Sirul citit este: 'Thu Apr 30 02:05:39 EEST 2020'
注:
1)我必须使用date
2)我没有故意检查孩子的返回状态
3)我知道使用wait(NULL)
不是一个好习惯。
我设法解决了我的问题。我正在寻找类似的东西:
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#define BUFFER_SIZE 105
int main()
{
int channel[2];
if(pipe(channel) == -1) { printf("Eroare la crearea pipe ului!
"); return 1; }
pid_t pid = fork();
if(pid < 0) { printf("Eroare la crearea procesului
"); }
else if(pid > 0)
{
close(channel[1]); // close pipe's writing end
// wait(NULL); // wait for children to finish
int status;
waitpid(pid, &status, 0); // wait for children to finish
int return_value = WEXITSTATUS(status);
char aux[BUFFER_SIZE];
read(channel[0], aux, BUFFER_SIZE);
close(channel[0]); // close pipe's reading end
printf("%s
", aux);
//exit(0);
}
else
{
close(channel[0]); // inchid capatul de citire al pipe ului (in copil voi scrie in pipe)
system("date >> temp.txt"); /* I have eventually used an auxiliary file to get the output of `date`
command into it, then read it using f.
*/
FILE * fptr = fopen("temp.txt", "r");
if(fptr == NULL) { printf("eroare la crearea fisierului auxiliar
"); exit(EXIT_FAILURE); }
char buffer[BUFFER_SIZE];
fgets(buffer, BUFFER_SIZE, fptr); // read date
fclose(fptr); // close file
remove("temp.txt"); // delete temporary file
buffer[strlen(buffer) - 1] = ' '; // delete '
' character from the end of read string (might need it without the '
' later)
write(channel[1], buffer, sizeof(buffer)); // scriu in capatul de scriere al pipe ului data citita
exit(0); // succesfully leave child
}
return 0;
}
现在,我将尝试使用popen
来实现可能更简单的方法;也由约瑟夫·西伯(Joseph Sible-Reinstate Monica)建议。
以上是关于将date命令的输出读入C脚本Unix中的变量中的主要内容,如果未能解决你的问题,请参考以下文章
Shell脚本(脚本结构和执行方法,date命令用法,脚本中的变量)
shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量
如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?
20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量