免费注册 查看新帖 |

Chinaunix

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

[函数] 欢迎0521回来讨论main函数之前的动作问题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-08-14 12:12 |只看该作者
程序的入口可否说是在一个fork()的时候,
fork()之后执行exec,
exec先初始化一些环境变量和参数,然后通过这些参数调用main,
fork创建新进程,exec执行新进程 —— <apue>

man stdin:
Since the symbols stdin, stdout, and stderr are specified to be macros, ... The standard streams are closed by a call to exit(3) and by normal program termination.
...
The stdin, stdout, and stderr macros conform to ANSI X3.159-1989 (``ANSI C89''), and this standard also stipulates that these three streams shall be open at program startup.

stdin/out/err确实是全局宏定义,不过在程序启动时(fork->exec)打开,结束时(exit)关闭,
不知道我说的对不对……

不过思一克的那个小程序该怎么解释?

论坛徽章:
0
42 [报告]
发表于 2007-08-14 12:13 |只看该作者
有意义。MS基本东西是和UNIX学的。不会有很大出入。

MS上pipe "|"  也一样能用。

原帖由 liuweni 于 2007-8-14 12:11 发表
两个系统都不相同,众所周知,M$总是喜欢把自己的东西加到语言里,比如J++什么的。

所以,上面几位在环境都不相同的状态下进行讨论,你们认为有意义吗???

论坛徽章:
0
43 [报告]
发表于 2007-08-14 12:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
44 [报告]
发表于 2007-08-14 12:18 |只看该作者
我前面帖子已经证明了,进程启动后不能自动open 012. 否则UNIX就麻烦大了。


原帖由 jamesr 于 2007-8-14 10:57 发表
stdin、stdout、stderr是进程负责打开的。只要是程序启动,这三个文件就被打开了。
具体什么时候打开的不知道。
通过如下方法测试:
a.c:
int main(){while(1);}
gcc a.c
./a.out &
显示出
[1] 3041
l ...

论坛徽章:
0
45 [报告]
发表于 2007-08-14 12:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
46 [报告]
发表于 2007-08-14 12:24 |只看该作者
linux
012来自初始的init进程
init进程的前身是init内核线程

/* This is a non __init function. Force it to be noinline otherwise gcc
* makes it inline to init() and it becomes part of init.text section
*/
static int noinline init_post(void)
{
        free_initmem();
        unlock_kernel();
        mark_rodata_ro();
        system_state = SYSTEM_RUNNING;
        numa_default_policy();

        if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
                printk(KERN_WARNING "Warning: unable to open an initial console.\n");
        (void) sys_dup(0);
        (void) sys_dup(0);
        上面3句就是012的最终来源

        if (ramdisk_execute_command) {
                run_init_process(ramdisk_execute_command);
                printk(KERN_WARNING "Failed to execute %s\n",
                                ramdisk_execute_command);
        }

        /*
         * We try each of these until one succeeds.
         *
         * The Bourne shell can be used instead of init if we are
         * trying to recover a really broken machine.
         */
        if (execute_command) {
                run_init_process(execute_command);
                printk(KERN_WARNING "Failed to execute %s.  Attempting "
                                        "defaults...\n", execute_command);
        }
        run_init_process("/sbin/init");
        run_init_process("/etc/init");
        run_init_process("/bin/init");
        run_init_process("/bin/sh");
        一个一个试,所以即使是init文件也不是自己打开012的,它的代码里面也没有打开012的语句
        panic("No init found.  Try passing init= option to kernel.");
}

论坛徽章:
0
47 [报告]
发表于 2007-08-14 12:29 |只看该作者
即便是 stdin,stdout,等,我也没有见过需要显示的打开,就像楼上说到的,可以是静态分配的结构,而起它的FILE很可能来自malloc,但是也不排除来自静态结构(C里面不是有规定最大文件多少个的宏吗,它可以决定FILE数组要多少个)

论坛徽章:
0
48 [报告]
发表于 2007-08-14 12:30 |只看该作者
stdin(FILE*) 用fdopen 和 0 对应起来的。

原帖由 flw2 于 2007-8-14 12:29 发表
即便是 stdin,stdout,等,我也没有见过需要显示的打开,就像楼上说到的,可以是静态分配的结构,而起它的FILE很可能来自malloc,但是也不排除来自静态结构(C里面不是有规定最大文件多少个的宏吗,它可以决定 ...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
49 [报告]
发表于 2007-08-14 12:33 |只看该作者
原帖由 思一克 于 2007-8-14 12:30 发表
stdin(FILE*) 用fdopen 和 0 对应起来的。

我怀疑连 fdopen 都没有。
可能是硬编码。

论坛徽章:
0
50 [报告]
发表于 2007-08-14 12:34 |只看该作者
TO flw
可能。
可以看GLIBC代码。不难找到。不过没有什么意义。

原帖由 flw 于 2007-8-14 12:33 发表

我怀疑连 fdopen 都没有。
可能是硬编码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP