将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命令用法,脚本中的变量)

为啥我的 bash 脚本无法识别 date 命令中的变量?

shell脚本介绍 shell脚本结构和执行 date命令用法 shell脚本中的变量

Linux Shell中的命令替换

如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量