当前位置: 技术问答>linux和unix
exec函数的疑问
来源: 互联网 发布时间:2017-01-17
本文导语: 执行时关闭标志:在进程中每个打开的文件描述符都有一个执行时关闭标志,若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。这句话理解还是没问题的,但自己无法写程序证明,有谁可以帮忙写...
执行时关闭标志:在进程中每个打开的文件描述符都有一个执行时关闭标志,若此标志设置,则在执行exec时关闭该描述符,否则该描述符仍打开。这句话理解还是没问题的,但自己无法写程序证明,有谁可以帮忙写个小程序证明这句话吗?谢谢了
《unix环境高级编程》有句话:posix.1明确说明要求在执行exec时关闭打开的目录流。这句怎么理解?最好有程序说明下,谢谢了
《unix环境高级编程》有句话:posix.1明确说明要求在执行exec时关闭打开的目录流。这句怎么理解?最好有程序说明下,谢谢了
|
写一个被调用的小程序,简单的输出一个hello world
写一个调用程序,设置描述符1的执行时关闭标识,然后exec执行上面那个小程序
看还能否输出hello world
目录流那个是不是指打开的目录?
写一个调用程序,设置描述符1的执行时关闭标识,然后exec执行上面那个小程序
看还能否输出hello world
目录流那个是不是指打开的目录?
|
父进程open一个文件,得到一个fd=3,设置执行时关闭。
fork一个子进程,此时可以操作fd=3
exec执行一个程序,fd=3作为argv[1]传给它。
程序里边int fd=atoi(argv[1]); 然后读fd,发现返回-1。
fork一个子进程,此时可以操作fd=3
exec执行一个程序,fd=3作为argv[1]传给它。
程序里边int fd=atoi(argv[1]); 然后读fd,发现返回-1。
|
EBADF fd 不是一个合法的文件描述符,或者不是为读操作而打开.
EINVAL fd 所连接的对象不可读.
错误不外乎这两个,自己试试。
这是设置方法。
另外2.6内核新增功能,设置之后即便dup了其他副本,它们继承执行时关闭属性。
要理解这些可能需要多看一下APUE那一章节,深刻理解一下描述符,文件表项和node结点的关系以及父子进程继承了些什么东西,。
EINVAL fd 所连接的对象不可读.
错误不外乎这两个,自己试试。
File descriptor flags
The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC, the close-
on-exec flag. If the FD_CLOEXEC bit is 0, the file descriptor will remain open across an execve(2), otherwise it will be closed.
F_GETFD (void)
Read the file descriptor flags; arg is ignored.
F_SETFD (long)
Set the file descriptor flags to the value specified by arg.
这是设置方法。
File descriptor flags
The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined: FD_CLOEXEC, the close-
on-exec flag. If the FD_CLOEXEC bit is 0, the file descriptor will remain open across an execve(2), otherwise it will be closed.
F_GETFD (void)
Read the file descriptor flags; arg is ignored.
F_SETFD (long)
Set the file descriptor flags to the value specified by arg.
另外2.6内核新增功能,设置之后即便dup了其他副本,它们继承执行时关闭属性。
要理解这些可能需要多看一下APUE那一章节,深刻理解一下描述符,文件表项和node结点的关系以及父子进程继承了些什么东西,。
|
F_DUPFD_CLOEXEC (long; since Linux 2.6.24)
As for F_DUPFD, but additionally set the close-on-exec flag for the duplicate descriptor. Specifying this flag permits a program to avoid
an additional fcntl() F_SETFD operation to set the FD_CLOEXEC flag. For an explanation of why this flag is useful, see the description of
O_CLOEXEC in open(2).
贴错。