系统 第四天 进程的创建,结束,无名管道

exec 创建进程

  • 然后并不理解有什么用,启动另外一个进程,本身进程结束
#include
#include
#include
#include
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
#include
#include
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 
#include
#include
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;
}

你可能感兴趣的:(系统 第四天 进程的创建,结束,无名管道)