Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
为什么execve返回的结果与user不同_C_Execve_Cal - Fatal编程技术网

为什么execve返回的结果与user不同

为什么execve返回的结果与user不同,c,execve,cal,C,Execve,Cal,因此,我对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

因此,我对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

建议的守则如下:

#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;
    }           
}
  • 干净地编译
  • 执行所需的功能
  • 正确检查错误
  • 注意:需要执行
    /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;
        }           
    }
    

    因此,程序没有打印日历的原因似乎是因为我没有在第3行正确地使用NULL终止myArgv char数组,而是使用带引号的“”NULL“结束数组,相反,我应该使用不带引号的“NULL终止。

    关于:
    execve(/usr/bin/cal)”,myArgv,myEnv)这最好写成:
    execve(“/usr/bin/cal”,myArgv,myEnv);perror(“Exeve失败”);退出(退出失败)关于:
    printf(“等待execve完成的父进程”)
    后面应该跟:
    waitpid(pid,NULL,0)注意:发布的代码无法检查函数的故障:
    fork()
    请记住
    fork()
    有三种返回类型:1)0表示在父进程中,当您关闭整个环境时可能会混淆,但是
    HOME