linux: 程序多收一次 SIGHUP 信息

會收SIGHUP信息有2種:

1. session leader 死亡,前台進程組所有成員都收到SIGHUP.

2. 一個程序死亡,正好形成孤兒進程組且有成員處於停止狀態,則此孤兒進程組

所有成員先收到SIGHUP然後SIGCONT.

shell(leader) ---fork---> A(leader) ---fork---> B

在shell 上執行A ,利用ctrl+z 讓此進程組處於停止狀態,並將進程組長 A kill ,

其A子程序B 收到SIGHUP ---> SIGCONT ---> SIGHUP.

為何B會多收一次SIGHUP? 這個信號是由何種因素發出來?

請教大大~~

Update:

kill A.

還有一個問題,SIGHUP/SIGCONT 是送給暫停狀態的

proces 還是所有成員? 2種說法都出現過,我測試是就算部分成員沒有暫停狀態,還是會收到SIGHUP/SIGCONT.

Update 2:

上面另一個問題應該是所有成員.

http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

其中一段:

If termination of a process causes a process group to become orphaned, and some member is stopped, then all are sent first SIGHUP and then SIGCONT.

至於多收一個SIGHUP 仍然不知因素? :(

Update 3:

恩~~ 竟然可以! ~"~ ,不知當出是那個環節error.

回到euid,程式如下:

/* test.cpp */

#include <stdio.h>

#include <unistd.h>

#include<stdlib.h>

#include <sys/types.h>

#include<sys/fsuid.h> //glibc

int main()

Update 4:

{

system("ps -o ruid -o euid -o suid -o fsuid -o fname -A");

FILE *p=fopen("1.txt","r");

if(p==0)

printf("open fail\n"),fflush(stdout);

else

printf("open success\n"),fflush(stdout);

/**** 改變 fsuid *****/

Update 5:

setfsuid(getuid());

system("ps -o ruid -o euid -o suid -o fsuid -o fname -A");

p=fopen("1.txt","r");

if(p==0)

printf("open fail\n"),fflush(stdout);

else

printf("open success\n"),fflush(stdout);

}

Update 6:

[root@localhost root]# ls -l

-rw------- 1 root root 37 9月 4 15:21 1.txt

-rws--x--x 1 root root 12537 9月 4 16:04 test

用戶 kennedy(500)

[root@localhost root]# su kennedy

[kennedy@localhost root]$ ./test

RUID EUID SUID FSUID COMMAND

Update 7:

.................................

500 0 0 0 test

open success

RUID EUID SUID FSUID COMMAND

.................................

500 0 0 500 test

open fail

Update 8:

檔案rwx 受限於fsuid, 不是由euid決定!?

fsuid是決定filesystem 的屬性物件有

無修改權力,還是我想錯了. 感謝大大抽空幫忙...

Update 9:

http://blom.to/doc/HOWTO/en-html/Secure-Programs-H... :

EUID, EGID - effective UID and GID used for privilege checks (except for the filesystem)

filesystem 是指包含rwx權限檢查,和相關

filesystem object 屬性(setuid setgid sticky rwx 等bit設置).

Update 10:

那euid/egid 的權限檢查除了filesystem除外,那它到底是指

哪一部分權限檢查? reboot() 等之類的核心函式呼叫的

檢查嗎? 不然還是指哪一部分?

rwx的權限檢查(不是rwx bit 設置)是歸類在filesystem嗎?

煩請大大解惑一下~~

2 Answers

Rating
  • Lv 7
    2 decades ago
    Favorite Answer

    你是kill A還是kill shell?

    2005-09-04 02:10:30 補充:

    OK, 不知為何我執行時並無多餘的SIGHUP.[dwh@pulsar dwh]$ cat test1.c#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main() {     pid_t child;     child = fork();     if (child == 0)     {        execl("test2", NULL);     } else if (child != -1) {        printf("child pid is %d\n", child);        while (1);     } else {        printf("fail to fork\n");     }     return(0);}[dwh@pulsar dwh]$ cat test2.c#include <stdio.h>#include <signal.h>volatile int i = 0;void sighup() {        printf("received SIGHUP %d\n", i++);}void sigcont() {        printf("received SIGCONT %d\n", i++);}int main() {        if (signal(SIGHUP, sighup) == SIG_ERR) {                printf("error setting up SIGHUP\n");                return(-1);        }        if (signal(SIGCONT, sigcont) == SIG_ERR) {                printf("error setting up SIGCONT\n");                return(-1);        }        while (1);        return(0);}[dwh@pulsar dwh]$ ./test1child pid is 27045[1]+  Stopped                 ./test1[dwh@pulsar dwh]$ ps -ef | grep test1dwh      27044 27014  0 13:21 pts/17   00:00:00 ./test1dwh      27047 27014  0 13:21 pts/17   00:00:00 grep test1[dwh@pulsar dwh]$ kill -9 27044[dwh@pulsar dwh]$ received SIGCONT 1received SIGHUP 0我只有收到SIGHUP和SIGCONT. SIGHUP先而SIGCONT後.能否刊出你的程式碼?----------------------------------------------具我所知, fsuid在正常情況之下是跟euid一樣的. 當euid被改時fsuid也跟著被改. fsuid在Linux裡才有, 其用途是用來給file system檢查此process/thread有無權力讀取, 更改及執行file system裡的檔案及資料夾. 所以linux並不是用euid喔. 但因大部分時間fsuid和euid一樣(除了在處理NFS的資料時)且fsuid不是公認的, 所以一般人還是以為是用euid.懂不懂?不懂請再問----------------------------------------------據我所知對,沒錯.像reboot(), vmount(), 和setfsuid()等等.對,沒錯.rwx是屬於file system

    2005-09-04 02:25:13 補充:

    能否在此刊出你EUID的問題?

    2005-09-04 11:40:08 補充:

    蠢蠢的,對不起.回晚了

  • 2 decades ago

    看到了一個傻眼的問題......@@||| :p 印象中「SIGHUP」和Linux的prosess生死有關係,用來關掉控制中的prosess。只是......正確性有待考核了!因為這問題真的很少人會注意到...... :p

Still have questions? Get your answers by asking now.