进程和程序
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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述