linux/unix 编程手册 fork()函数

时间:2024-01-09 12:06:14

父进程通过fork()函数创建子进程,将父进程数据段和栈的内容拷贝到子进程中,子进程执行程序execve创建新程序,调用exit函数退出到等待wait(),挂起父进程,

父子进程享用相同的程序文本段。

在父进程中,fork 新创建进程的进程id,在子进程中返回0,失败-1,

如果子进程更新了文件偏移量,那么这种改变也会影响到父进程的文件描述符,

mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。 mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证 了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1;

子进程修改文件后,父进程也会受其影响。

int
main(int argc, char *argv[])
{
int fd, flags;
char template[] = "/tmp/testXXXXXX";

setbuf(stdout, NULL); /* Disable buffering of stdout */

/* Open a temporary file, set its file offset to some arbitrary value,
and change the setting of one of the open file status flags. */

fd = mkstemp(template);
if (fd == -1)
errExit("mkstemp");

printf("File offset before fork(): %lld\n",
(long long) lseek(fd, 0, SEEK_CUR));

flags = fcntl(fd, F_GETFL);
if (flags == -1)
errExit("fcntl - F_GETFL");
printf("O_APPEND flag before fork() is: %s\n",
(flags & O_APPEND) ? "on" : "off");

switch (fork()) {
case -1:
errExit("fork");

case 0: /* Child: change file offset and status flags */
if (lseek(fd, 1000, SEEK_SET) == -1)
errExit("lseek");

flags = fcntl(fd, F_GETFL); /* Fetch current flags */
if (flags == -1)
errExit("fcntl - F_GETFL");
flags |= O_APPEND; /* Turn O_APPEND on */
if (fcntl(fd, F_SETFL, flags) == -1)
errExit("fcntl - F_SETFL");
_exit(EXIT_SUCCESS);

default: /* Parent: can see file changes made by child */
if (wait(NULL) == -1)
errExit("wait"); /* Wait for child exit */
printf("Child has exited\n");

printf("File offset in parent: %lld\n",
(long long) lseek(fd, 0, SEEK_CUR));

flags = fcntl(fd, F_GETFL);
if (flags == -1)
errExit("fcntl - F_GETFL");
printf("O_APPEND flag in parent is: %s\n",
(flags & O_APPEND) ? "on" : "off");
exit(EXIT_SUCCESS);
}
}

文件控制函数          fcntl -- file control
头文件:

#include <unistd.h>

#include <fcntl.h>

函数原型:

int fcntl(int fd, int cmd);

int fcntl(int fd, int cmd, long arg);

int fcntl(int fd, int cmd, struct flock *lock);

描述:

fcntl()针对(文件)描述符提供控制.参数fd是被参数cmd操作(如下面的描述)的描述符.

    针对cmd的值,fcntl能够接受第三个参数(arg)

fcntl函数有5种功能:

     1.复制一个现有的描述符(cmd=F_DUPFD).

         2.获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).

3.获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).

4.获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).

5.获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).