免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: weihuishi110
打印 上一主题 下一主题

uclinux 下vfork 和 fork问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-06-17 12:19 |只看该作者
你可以在vfork出来的子进程里 用exec再次执行服务程序。。。。
funix_zjx 发表于 2010-06-17 11:09



   这样做的话些程序就不能及时与用户交互了

论坛徽章:
0
32 [报告]
发表于 2010-06-17 12:21 |只看该作者
你理解错了,不是这样的,试试就知道了。
funix_zjx 发表于 2010-06-17 10:48



    没理解错,如果不是这样,那父程序的fork和vfork就一样了

论坛徽章:
0
33 [报告]
发表于 2010-06-17 15:18 |只看该作者
回复 29# funix_zjx
  1. char buffer[1024];
  2. char exepath[1024];
  3. sprintf(exepath,"/proc/%d/exe",getpid());
  4. int n = readlink(exepath,buffer,1024);
复制代码
readlink返回总是失败~这是为什么呢?

论坛徽章:
0
34 [报告]
发表于 2010-06-17 16:32 |只看该作者
  1. char buffer[1024];
  2. char exepath[1024];
  3. sprintf(exepath,"/proc/%d/exe",getpid());
  4. int n = readlink(exepath,buffer,1024);
复制代码
readlink返回总是失败~这是为什么呢?
调用strerror返回失败原因是:
no such file or directory
但是这个文件是存在的~用ls命令可以看到~
但是用ls显示时也有提示这个错误,但是有这个文件存在
/proc/22 # ls -l
-r--------    1 0        0               0 Jan  1 00:02 auxv
-r--r--r--    1 0        0               0 Jan  1 00:02 cmdline
lrwxrwxrwx    1 0        0               0 Jan  1 00:02 cwd -> /usr/bin
-r--------    1 0        0               0 Jan  1 00:02 environ
ls: ./exe: cannot read link: No such file or directory
lrwxrwxrwx    1 0        0               0 Jan  1 00:02 exe

dr-x------    2 0        0               0 Jan  1 00:02 fd
-r--r--r--    1 0        0               0 Jan  1 00:02 maps
-rw-------    1 0        0               0 Jan  1 00:02 mem
-r--r--r--    1 0        0               0 Jan  1 00:02 mounts
-r--------    1 0        0               0 Jan  1 00:02 mountstats
-rw-r--r--    1 0        0               0 Jan  1 00:02 oom_adj
-r--r--r--    1 0        0               0 Jan  1 00:02 oom_score
lrwxrwxrwx    1 0        0               0 Jan  1 00:02 root -> /
-r--r--r--    1 0        0               0 Jan  1 00:02 stat
-r--r--r--    1 0        0               0 Jan  1 00:02 statm
-r--r--r--    1 0        0               0 Jan  1 00:02 status
dr-xr-xr-x    3 0        0               0 Jan  1 00:02 task

论坛徽章:
0
35 [报告]
发表于 2010-06-17 16:35 |只看该作者
请各位大虾帮忙看下是为什么~
难道是我这个uclinux版本不支持这个吗?

论坛徽章:
0
36 [报告]
发表于 2010-06-18 09:34 |只看该作者
if(!setToForeground )
    {
#ifdef LINUX
        daemon(0, ucDebug);

#elif defined UCLINUX
        daemonize(ucDebug, argc, argv);
#endif
    }

---------------------------------------------------------------------

/*For uClinux doesn't support daemon() function, so we need implement it by ourself.*/
void daemonize (unsigned char ucDebug, int argc, char **argv)
{
   int         iRet = 0;
   int         fd = -1;

   if (1 == getppid ()) /* already a daemon */
   {
        setsid (); /* set new process group */

        if (0x00 == ucDebug)
        {
            /*Close all the file description.*/
            for (iRet = getdtablesize (); 0 <= iRet; --iRet)
            {
                 fd = iRet;  
                 close(fd);
            }
   
            fd = open("/dev/null", O_RDWR); /*Redirect Standard input [0] to /dev/null */
            dup (fd); /*Redirect Standard output [1] to /dev/null */
            dup (fd); /*Redirect Standard error [2] to /dev/null */
        }

        umask (027); /* set newly created file mode mask */
        chdir("/"); // change running directory

        return ;
   }
   else
   {
       iRet = vfork ();

       if (0 > iRet) _exit (1); /* fork error */
       if (0 < iRet) _exit (0); /* parent exit */

       /*Child process(daemon) continue and fork again.*/

       iRet = vfork ();
       if (0 > iRet) _exit (1); /* fork error */
       if (0 < iRet) _exit (0); /* parent exists */

       /* Parent exit, so child process parent pid should be init process(pid is 1) */
       execv (argv[0], argv); /*Run the pograme again.*/
       _exit (1); /*If execv() returned, then something error happend.*/
   }
}

论坛徽章:
0
37 [报告]
发表于 2010-06-18 09:37 |只看该作者
回复 34# weihuishi110


   由于uClinux不支持MMU,所以在uClinux系统里并不像标准Linux那样存在/proc/%d/exe",getpid()  这么一个符号链接。

论坛徽章:
0
38 [报告]
发表于 2010-06-18 09:44 |只看该作者
回复 36# dglwx


    你这个不好用啊~前面回帖已经说了,vfork是在子进程运行结束或调用exec时父进程才运行,你那段代码我用过,父进程永远不会放弃终端~直到子进程结束~

论坛徽章:
0
39 [报告]
发表于 2010-06-18 11:13 |只看该作者
本帖最后由 dglwx 于 2010-06-18 11:29 编辑

回复 38# weihuishi110

  你有试运行吗?20楼就已经告诉你19楼代码的问题了: vfork()两次后调用exec*()重新执行程序。我的uclinux下的所有damon程序都是用它,一直工作得好好的。

root:/tmp> tftp -gr restored 10.78.28.15
root:/tmp> chmod a+x restored
root:/tmp> ./restored -m sd   
root:/tmp>
root:/tmp> ps | grep restored
  224 root       128 S    ./restored -m sd
  227 root      1024 S    grep restored

论坛徽章:
0
40 [报告]
发表于 2010-06-18 15:07 |只看该作者
回复 39# dglwx


    没有看到最后面那几行,感觉和我原来的代码类似~~果然是大师~~谢谢~
    现在我也是用这个方法来实现的~!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP