unistd.h中定义的setsid()与fork()

setsid():是一个UNIX系统调用,用于创建一个新的会话(session)并将当前进程设置为该会话的领头进程(session leader)。通常情况下,setsid() 函数用于创建守护进程(daemon),以确保它与任何终端分离,从而可以在后台独立运行,而不受终端的影响。

1、它创建一个新的会话。

2、将调用进程设置为新会话的领头进程(session leader)。

3、如果调用进程之前是进程组的组长(group leader),那么它会放弃组长地位,以避免接收来自控制终端的信号。

实际就是脱离父进程,自由自在的活着

fork():是一个UNIX和类UNIX系统中的系统调用,用于创建一个新的进程,新进程是调用进程的子进程。fork() 函数的作用是创建一个几乎完全相同的子进程,包括进程的代码、数据和上下文,但子进程拥有自己独立的进程ID(PID)

1、创建新进程: fork() 用于创建一个新的进程,新进程是原进程的副本。这两个进程在调用fork() 之前是完全相同的,但后续它们可以独立运行,执行不同的代码。

2、并发执行: 通常,父进程和子进程会并发运行,即它们可以同时执行不同的代码。这允许在多进程编程中执行并行任务。

3、分支执行: fork() 的典型用例是将一个进程分成两个分支,其中一个分支(子进程)可以执行不同的操作,而另一个分支(父进程)可以执行其他操作。

4、多任务处理: fork() 可用于创建多个进程来处理不同的任务,例如服务器程序可以使用多个进程来同时处理客户端请求。

5、后台任务: 通过fork() 可以创建后台进程,它们在后台独立运行,不受终端会话的影响。

需要注意的是,父进程和子进程之间并不共享内存,它们有各自的内存空间,因此在进程间通信时需要使用专门的IPC(进程间通信)机制,如管道、消息队列、共享内存等。

实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
pid_t pid;

// Create a child process
pid = fork();

// Check for errors
if (pid < 0) {
    perror("Fork error");
    exit(1);
}

// If we are in the parent process, exit
if (pid > 0) {
    printf("Parent process exiting.\n");
    exit(0);
}

// We are now in the child process
printf("Child process (daemon) started.\n");

// Create a new session and become the session leader
if (setsid() < 0) {
    perror("Setsid error");
    exit(1);
}

// Change the current working directory to root
if (chdir("/") < 0) {
    perror("Chdir error");
    exit(1);
}

// Close standard file descriptors (stdin, stdout, stderr)
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

// Run as a background daemon
while (1) {
    // Your daemon code goes here
    sleep(1); // For demonstration, sleep for 1 second
}

return 0;

}

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值