setpgrp/setpgid失败(?),适用于Mac OSX,不适用于Linux
问题描述:
我试图编写一个程序来执行一个子命令,并且不允许该子项被Ctrl + C杀死。setpgrp/setpgid失败(?),适用于Mac OSX,不适用于Linux
我读过,我可以用setpgid/setpgrp完成此操作。
下面的代码工作在OSX,但在Linux(2.6.32,Ubuntu的10.04)运行像,
./a.out ls
原因没有输出发生,程序不能SIGINT被杀死。
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
int main(int argc, char **argv) {
if (argc < 2) {
printf("Please provide a command\n");
exit(1);
}
int child_pid = vfork();
if (child_pid == 0) {
if (setpgrp() == -1) {
perror("setpgrp error");
exit(1);
}
printf("Now executing the command:\n");
argv++;
if (execvp(argv[0], argv) == -1) {
perror("Could not execute the command");
exit(1);
}
}
int child_status;
wait(&child_status);
}
如果您注释掉对setpgrp的调用,您将看到其余代码正常工作。
答
我不得不修改代码的这一部分,以使它可以在两个平台上工作。我想这只是内核如何处理会话和进程组的差异。
if (setsid() == -1) {
#ifdef LINUX
perror("setsid error");
exit(1);
#else
if (setpgrp() == -1) {
perror("setpgrp error");
exit(1);
}
#endif
}
**只是一个FYI **'setsid()'成功的OS X后,没有根在一个子进程完全fork后。基本上'vfork'复制了一些东西,但流程环境结构在两者之间共享(几乎就像一个进程和一个线程之间的混合)......它意味着fork/exec产卵的速度更快,其中复制环境是浪费精力。 (为什么是的,我们确实在大学的MINUX 2中实现了'vfork',感谢提问;)) – Barry 2016-04-14 01:00:58