请问,我在写Linux守护进程的时候,先是调用fork()创建新的进程,之后又调用setsid(),之后又调用fork()将这个进程变为非组长进程,结果发现这个进程不能向摸个文件中写入数据了,经过我不断测试,发现问题就是出现在第二次fork()上。
请问各位大神,非组长进程是不是不能进行一切读写操作?包括向标准输出输入,和文件输入读取
Linux守护进程的问题...................
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-05 13:11关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在Linux系统中,当一个进程被设置为非组成员(Non-Group)后,它将失去对所有其他用户的权限。这意味着它无法访问任何共享资源,包括标准输出、标准错误和其他可执行的文件。
例如,当你运行
echo "Hello, World!" > /dev/null; echo $?时,/dev/null是一个空文件,它不会被任何用户所拥有或使用。因此,你不能通过echo命令向/dev/null中写入文本,因为你的进程没有权限这样做。另外,如果你尝试以root身份运行
echo "Hello, World!" > /dev/null; echo $?,你会看到0作为返回值,这表明你的进程是当前用户的根进程,而不是非组成员。这说明问题出在你试图在非组成员进程中写入内容之前设置了setsid()。解决这个问题的方法是:
- 将
setsid()放在fork()之前的任何地方,这样可以确保新进程成为非组成员。 - 在父进程中使用
setsid()来防止子进程获取父进程的所有权。 - 如果可能的话,使用
chdir()切换到非组成员的目录,并在子进程中运行chown命令将文件所有权从root更改为非组成员。
以下是一个简单的示例:
#!/bin/bash # 设置为非组成员 set -g GROUPS none # 调用 fork 并设置为非组成员 pid=$($PIDOF -p $! && setsid) # 确保子进程也是非组成员 set +g GROUPS none # 尝试向文件写入内容 echo "Hello, World!" > /dev/null # 检查是否成功 exit_code=$?在这个例子中,我们首先设置
none为GROUPS标志,然后使用setsid()调用fork函数。由于我们是在父进程中设置setsid(),所以子进程也会自动成为非组成员。最后,我们尝试向文件中写入内容,如果失败,exit_code变量将包含错误码。解决 无用评论 打赏 举报- 将