日期:2014-05-16  浏览次数:20715 次

初学Linux IPC,多指教。。。
接触Linux编程一个月的样子,照着Linux编程入门到精通在学,现学到了IPC机制。ipc过了一遍了,感觉有的繁,里面的结构有点多,有点理不清头绪。准备再探。如果有对Linux IPC熟悉的,请给点意见。如,学这个东西需要注意的地方,重点要掌握的地方之类的。如果可以的话,可以分享自身成功的经验,有问题的也可以提出来一起学习。。。

下面是我学进程时遗留下来的问题,如果可以也给我一并解决了吧(我就发了三个帖子,之前两个都是这个问题,还没解决彻底)
C/C++ code
pid_t pid;
void handle(int signo){
 /*****************************问题所在*************************************************
  *多执行几次pid会出现不同的结果0,或者子进程的pid
  *一个是fork返回到子进程的值,一个是返回到父进程的值
  *问题:这个函数是父进程执行的,pid不应该是fork返回到父进程的值么,为什么可能为0呢???
  *请各位指教。
****************************************************************************************/
        printf("Current time:%d\n",pid);     
        kill(pid,SIGUSR1);
}

int main(){;
    int i;
    int stat;
    signal(SIGCLD,SIG_IGN);
    signal(SIGUSR1,SIG_IGN);
        signal(SIGUSR2,handle);
    pid=fork();
    if(pid<0){
        perror("fork");
        exit(-1);
    }
    else if(pid==0){
        kill(getppid(),SIGUSR2);
        pause();
        exit(0);
    }    
    wait(&stat);
    return 0;
}


------解决方案--------------------
是父子进程都用同一个信号处理程序引起的
------解决方案--------------------
1. 不与实际的项目相结合,只是单纯地从书本上抄些例子, 是很难掌握其要领的。
2.
探讨
多执行几次pid会出现不同的结果0,或者子进程的pid

------解决方案--------------------
fork是调用一次,两次返回,pid你定义成全局,可有可能是子进程pid或0

探讨
1. 不与实际的项目相结合,只是单纯地从书本上抄些例子, 是很难掌握其要领的。
2.

引用:
多执行几次pid会出现不同的结果0,或者子进程的pid


这个请LZ再仔细检查一下程序运行结果,应该是只会出现0,而不会出现子进程的pid才对。如果运行结果确实如LZ所说,那可能就与操作系统的机制有关了。
子进程被创建后,它会复制一份与父进程相同的代……

------解决方案--------------------
是不返回两次,试验一下就知道了

在定义一个全局变量g_tmpPid;
C/C++ code

else if((g_tmpPid = pid)==0){
        kill(getppid(),SIGUSR2);
        pause();
        exit(0);
 }   

static void handle(int signo){
        printf("Current time:%d\n",g_tmpPid);     
        kill(pid,SIGUSR1);
}