exec 创建进程
- 然后并不理解有什么用,启动另外一个进程,本身进程结束
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
int ret =-1;
// ret = execl("/bin/ls","ls","/home/alex","-l",NULL);
// ret = execl("while","while",NULL);
//第一个参数是这个命令在哪,后面的就是命令执行的方式
char *const argv[] ={"gedit","Dircopy.c",NULL};
ret = execv("/usr/bin/gedit",argv);
// printf("errno = %d\n",errno);
// printf("error:%s\n",strerror(errno));
if(-1 == ret)
{
perror("execlp");
return -1;
}
return 0;
}
结束进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void fun1()
{
printf("fun1,,,");
}
void fun2()
{
printf("fun2,,,");
}
void fun3()
{
printf("fun3,,,");
}
int main()
{
atexit(fun1);
atexit(fun2);
atexit(fun3);
// _exit(-1);//直接结束进程
// exit(-1);//自杀,不会出现打印helloworld。
abort();//中间放弃,核心已转储:非正常结束
printf("helloworld\n");//当程序遇到return 0;也没有立即结束,
//会做一下善后工作,然后进入内核层,atexit会被执行,执行的顺序
//和注册相反
return 0;
}
管道
- grep抓取
- 要想实现在一个管道实现交流,就是说和读进行,不能都说,或者都读
- 通过pipe建立的管道叫做无名管道
#include <unistd.h>
#include<stdio.h>
#include<string.h>
int main()
{
int pipefd[2] = {-1};
//
int ret = -1;
ret = pipe(pipefd);
if(-1==ret)
{
perror("pipe");
return -1;
}
pid_t pid = -1;
pid = fork();
if(pid > 0)//父进程
{
char caBuf[64]={'\0'};
int iSign = 0;
while(1)
{
memset(caBuf,'\0',sizeof(caBuf));
if(0 == iSign)
{
printf("father write data:\n");
scanf("%s",caBuf);
write(pipefd[1],caBuf,strlen(caBuf));
iSign = 1;
}
else if(1==iSign)
{
read(pipefd[0],caBuf,sizeof(caBuf));
printf("child says:%s\n",caBuf);
iSign = 0;
}
sleep(1);
}
}
else if(0==pid)//子进程
{
char caBuf[64]={'\0'};
int iSign = 0;
while(1)
{
memset(caBuf,'\0',sizeof(caBuf));
if(0 == iSign)
{
read(pipefd[0],caBuf,sizeof(caBuf));
printf("父亲说:%s\n",caBuf);
iSign = 1;
}
else if(1==iSign)
{
printf("孩子说:\n");
scanf("%s",caBuf);
write(pipefd[1],caBuf,strlen(caBuf));
iSign = 0;
}
sleep(1);
}
}
else if(-1 == pid)
{
perror("fork");
return -1;
}
return 0;
}
网友评论