1

所以我对 C 语言 exec 系列函数相当陌生,想知道为什么 cal 返回

usage: cal [-13smjyV] [[[day] month] year]

当传递给execve(); 以下

    pid = fork( ) ;
    if ( pid == 0 )  {
            char *myArgv[ ] = { "cal", "4", "1980", "NULL"};
            char *myEnv[ ] = { "HOME=/usr/bin", NULL}  ;
            execve( "/usr/bin/cal", myArgv, myEnv) ;
    } else {
            printf("parent process waiting for execve complete \n" );
    }

而当我通过终端手动调用“cal 4 1980”时,我得到了实际的打印输出?

          April 1980     
     Su Mo Tu We Th Fr Sa
            1  2  3  4  5
      6  7  8  9 10 11 12
     13 14 15 16 17 18 19
     20 21 22 23 24 25 26
     27 28 29 30
4

2 回答 2

2

所以看起来程序没有打印日历的原因是因为我没有 NULL 正确终止第 3 行的 myArgv char 数组,而是以“NULL” 和引号结束了数组,而不是我应该只用NULL终止没有引号。

于 2019-11-21T06:49:51.513 回答
0

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误

注意:需要execute/bin/bash -c才能从环境中执行一个程序

现在建议的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main( void )
{
    pid_t pid = fork( );
    switch( pid )
    {
        case -1:
            perror( "fork failed" );
            exit( EXIT_FAILURE );
            break;

        case 0:
            // in child process
            {
                //char *myArgv[ ] = { "-c", "/usr/bin/cal", "4", "1980", "NULL"};
                //char *myEnv[ ] = { "HOME=/usr/bin", NULL}  ;
                execlp( "/bin/bash", "bash", "-c", "/usr/bin/cal", "-S", "4", "1980", NULL) ;
                perror( "execve failed" );
                exit( EXIT_FAILURE );
            }
            break;

        default:
            // in parent process
            printf("parent process waiting for execlp>>bash>>cal to complete \n" );
            waitpid( pid, NULL, 0 );
            break;
    }           
}

运行程序会导致:

parent process waiting for execlp>>bash>>cal to complete 
   November 2019      
Su Mo Tu We Th Fr Sa  
                1  2  
 3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28 29 30  
于 2019-11-21T06:48:27.980 回答