为什么execve返回的结果与user不同
因此,我对C语言exec系列函数相当陌生,我想知道为什么cal返回为什么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
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
?