>* 学习进程创建, 等待, 终止. 使用代码实现.
//系统调用创建进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int ret=fork();
printf("hello proc:%d!,ret:%d\n",getpid(),ret);
sleep(1);
return 0;
}
//等待终止
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t id=fork();
if(id<0)
{
perror("fork");
return 1;
}
else if(id>0)
{
printf("parent[%d] is sleeping...\n",getpid());
sleep(30);
}
else
{
printf("child[%d] is begin Z...\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
>* 编写自主shell(实现获取用户名, 主机名, 当前路径, alias, 内建指令(cd)>* 封装fork/wait等操作, 编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数.
- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- int process_create(int(*func)(), const char *file, char *argv[])
- {
- int ret = 0;
- pid_t pid = fork();
- if(pid == 0)
- {
- ret = func(file, argv);
- if(ret == -1)
- {
- printf("调用execvp失败\n");
- perror("func");
- _exit(-1);
- }
- }
- else
- {
- int st;
- pid_t ret = wait(&st);
- if(ret == -1)
- {
- perror("wait");
- exit(-1);
- }
- }
- return 0;
- }
- int main()
- {
- char *argv1[] = {"ls"};
- char *argv2[] = {"ls", "-al", "/etc/passwd", 0};
- process_create(execvp, *argv1, argv2);
- return 0;
- }
>* 调研popen/system, 理解这两个函数和fork的区别.
//popen
#include <stdio.h> #include <stdlib.h> void main( void ) { char psBuffer[128]; FILE *chkdsk; if( (chkdsk = _popen( "dir *.c /on /p", "rt" )) == NULL ) exit( 1 ); while( !feof( chkdsk ) ) {
if( fgets( psBuffer, 128, chkdsk ) != NULL ) printf( psBuffer ); } printf( "\nProcess returned %d\n", _pclose( chkdsk ) ); }
//system
#include <process.h> void main( void ) { system( "type system.c" ); }