我正在尝试编写一个执行子命令的程序,不允许该子被Ctrl + C杀死。
我读过我可以用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
}
关于c - setpgrp/setpgid失败(?),可以在Mac OSX上运行,不能在Linux上运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15179361/