进程和程序

execvp(const char *file,const char *argv);

 

 

代码
   
     
1 #include < unistd.h >
2 #include < string .h >
3 #include < signal.h >
4 #include < stdio.h >
5 #include < stdlib.h >
6
7   #define MAXARGS 20
8   #define ARGLEN 100
9
10 int main( void )
11 {
12 char * arglist[MAXARGS + 1 ];
13 int numargs;
14 char argbuf[ARGLEN];
15 char * makestring();
16
17 numargs = 0 ;
18
19 while (numargs < MAXARGS)
20 {
21 printf( " Arg[%d]: " ,numargs);
22 if (fgets(argbuf,ARGLEN,stdin) && * argbuf != ' \n ' )
23 arglist[numargs ++ ] = makestring(argbuf);
24 else
25 {
26 if (numargs > 0 )
27 {
28 arglist[numargs] = NULL;
29 execute(arglist);
30 numargs = 0 ;
31 }
32 }
33 }
34 return 0 ;
35 }
36
37 int execute( char * arglist[])
38 {
39 execvp(arglist[ 0 ],arglist);
40 perror( " execvp failed " );
41 exit( 1 );
42 }
43
44 char * makestring( char * buf)
45 {
46 char * cp;
47 buf[strlen(buf) - 1 ] = ' \0 ' ;
48 cp = ( char * )malloc(strlen(buf) + 1 );
49 if (cp == NULL)
50 {
51 fprintf(stderr, " no memory\n " );
52 exit( 1 );
53 }
54 strcpy(cp,buf);
55 return cp;
56 }
57

 

 pid_t result=fork(void);

 

 

代码
   
     
#include < unistd.h >
#include
< stdio.h >

int main( void )
{
int ret_from_fork,mypid;

mypid
= getpid();
printf(
" Before:my pid is %d\n " ,mypid);

ret_from_fork
= fork();

sleep(
1 );

printf(
" After my pid id %d,fork() said %d\n " ,getpid(),ret_from_fork);
}

 

 

  
    
#include < unistd.h >
#include
< stdio.h >

int main( void )
{
printf(
" my pid is %d\n " ,getpid());
fork();
fork();
fork();
printf(
" my pid is %d\n " ,getpid());
}

 

 

代码
   
     
#include < unistd.h >
#include
< stdio.h >

int main( void )
{
int fork_rv;
printf(
" before %d\n " ,getpid());
fork_rv
= fork();

if (fork_rv ==- 1 )
perror(
" fork " );
else if (fork_rv == 0 )
printf(
" child:%d\n " ,getpid());
else
printf(
" parent:%d,my child is %d\n " ,getpid(),fork_rv);
}

 

#include <sys/types.h>

#include <sys/wait.h>

pid_t result=wait(int *status);

 

 

代码
   
     
#include < unistd.h >
#include
< stdio.h >
#include
< stdlib.h >

#define DELAY 2

int main( void )
{
int newpid;
void child_code(),parent_code();

printf(
" before:my pid is %d\n " ,getpid());
if ((newpid = fork()) ==- 1 )
perror(
" fork " );
else if (newpid == 0 )
child_code(DELAY);
else
parent_code(newpid);
}

void child_code( int delay)
{
printf(
" child %d here,will sleep for %d seconds\n " ,getpid(),delay);
sleep(delay);
printf(
" child done about to exit\n " );
exit(
17 );
}

void parent_code( int childpid)
{
int wait_rv;
wait_rv
= wait(NULL);
printf(
" done waiting for %d,wait returned %d\n " ,childpid,wait_rv);
}

 

 

代码
   
     
#include < stdlib.h >
#include
< unistd.h >
#include
< stdio.h >

#define DELAY 5

void child_code();
void parent_code();
int main( void )
{
pid_t newpid;
printf(
" before:my pid is %d\n " ,getpid());

if ((newpid = fork()) ==- 1 )
perror(
" fork " );
else if (newpid == 0 )
child_code(DELAY);
else
parent_code();
}

void child_code( int delay)
{
printf(
" child %d here will sleep for %d seconds\n " ,getpid(),delay);
sleep(delay);
printf(
" child done\n " );
exit(
17 );
}

void parent_code( int childpid)
{
int wait_rv;
int child_status;
int high_8,low_7,bit_7;

wait_rv
= wait( & child_status);
printf(
" done waiting for %d,wait return %d\n " ,childpid,wait_rv);

high_8
= child_status >> 8 ;
low_7
= child_status & 0x7F ;
bit_7
= child_status & 0x80 ;
printf(
" status:exit=%d,sig=%d,core=%d\n " ,high_8,low_7,bit_7);
}

 

shell:

代码
   
     
#include < unistd.h >
#include
< stdlib.h >
#include
< string .h >
#include
< stdio.h >
#include
< signal.h >

#define MAXARGS 20
#define ARGLEN 100

char * makestring( char * argbuf);
void execute( char * arglist[]);

int main( void )
{
char * arglist[MAXARGS + 1 ];
int numargs = 0 ;
char argbuf[ARGLEN];
while (numargs < MAXARGS)
{
printf(
" Arg[%d]: " ,numargs);
if (fgets(argbuf,ARGLEN,stdin) && * argbuf != ' \n ' )
arglist[numargs
++ ] = makestring(argbuf);
else
{
if (numargs > 0 )
{
arglist[numargs]
= NULL;
execute(arglist);
numargs
= 0 ;
}
}
}
return 0 ;
}


char * makestring( char * argbuf)
{
char * cp;
argbuf[strlen(argbuf)
- 1 ] = ' \0 ' ;
cp
= ( char * )malloc(strlen(argbuf) + 1 );
if (cp == NULL)
{
fprintf(stderr,
" no memory\n " );
exit(
1 );
}
strcpy(cp,argbuf);
return cp;
}

void execute( char * arglist[])
{
int pid,exitstatus;
pid
= fork();

switch (pid)
{
case - 1 :
perror(
" fork error " );
exit(
1 );
case 0 :
execvp(arglist[
0 ],arglist);
perror(
" execvp failed " );
exit(
1 );
default :
while (wait( & exitstatus) != pid)
;
printf(
" child exited with status %d,%d\n " ,exitstatus >> 8 ,exitstatus & 0377 );
}
}

 

你可能感兴趣的:(进程)