进程和程序

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);
}
}

 

posted @ 2010-10-21 09:35  linyilong  阅读(259)  评论(0编辑  收藏  举报