1. 仿写exec函数组的那个任务
下面是改写代码
if(cpid>0){
sleep(1);
char arr1[10],arr2[10],arr3[10];
sprintf(arr1,"%d",fd1);
sprintf(arr2,"%d",fd2);
sprintf(arr3,"%ld",size);
execl("./father",arr1,arr2,arr3,NULL);
}
else if(0 == cpid){
char arr1[10],arr2[10],arr3[10];
sprintf(arr1,"%d",fd1);
sprintf(arr2,"%d",fd2);
sprintf(arr3,"%ld",size);
execl("./child",arr1,arr2,arr3,NULL);
}
father.c
#include <code.h>
int main(int argc, const char *argv[])
{
int fd1=atoi(argv[0]);
int fd2=atoi(argv[1]);
off_t size=atoi(argv[2]);
lseek(fd1, 0, SEEK_SET);
lseek(fd2, 0, SEEK_SET);
char buf;
for(int i=0;i<size/2;i++){
read(fd1,&buf,1);
write(fd2,&buf,1);
}
printf("前半部分拷贝完毕\n");
return 0;
}
child.c
#include <code.h>
int main(int argc, const char *argv[])
{
int fd1=atoi(argv[0]);
int fd2=atoi(argv[1]);
off_t size=atoi(argv[2]);
lseek(fd1, size/2, SEEK_SET);
lseek(fd2, size/2, SEEK_SET);
char buf;
for(int i=size/2;i<size;i++){
read(fd1,&buf,1);
write(fd2,&buf,1);
}
printf("后半部分拷贝完毕\n");
return 0;
}
运行结果
2. 孤儿进程,僵尸进程,守护进程
孤儿进程
#include <code.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid == 0){
while(1){
sleep(1);
printf("孤儿进程:%d\n",getpid());
}
}
if(pid > 0)
printf("父进程:%d\n",getpid());
return 0;
}
僵尸进程
#include <code.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid > 0){
printf("父进程:%d\n",getpid());
while(1)
sleep(1);
}
if(pid == 0){
printf("僵尸进程:%d\n",getpid());
exit(0);
}
return 0;
}
守护进程
#include <code.h>
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid == 0){
setsid();
chdir("/");
umask(0);
for(int i = 0; i<getdtablesize();i++)
close(i);
while(1)
{
//可执行代码
sleep(1);
}
}
return 0;
}