为了简化编程,有时候需要通过execl执行脚本,而不是执行编译出来的二进制文件,然后,然后,执行脚本的时候出现了一个让我很跳脚的问题。
1、这个是用bash执行脚本的源代码test_prctl.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <stdlib.h>
5 #include <sys/prctl.h>
6 #include <signal.h>
7
8
9
10 void my_system()
11 {
12 pid_t pid;
13 char * cmd = "gst-launch -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! aspectratiocrop aspect-ratio=16/9 ! textoverlay text=\"测试\" ! timeoverlay halign=right valign=top ! clockoverlay halign=left valign=top time-format=\"%Y/%m/%d %H:%M:%S\" ! ffmpegcolorspace ! xvimagesink";
14 pid = fork();
15 if (pid == 0)
16 {
17 prctl(PR_SET_PDEATHSIG, SIGKILL);
18 execl("/bin/bash", "/bin/bash", "-c", cmd, NULL);
19 exit(0);
20 } else if (pid < 0)
21 {
22 printf("create failed\n");
23 }
24 }
25
26 int main()
27 {
28 int i = 0;
29 my_system();
30 while ( 1 )
31 {
32 pause( ) ;
33 }
34 return 0;
35 }
36
2、而用sh执行脚本的源代码仅仅把上面源代码中的bash换为sh。
3、然后问题来了,我把他们编译执行之后得到的结果如下
1)用bash执行脚本的结果
7758 2361 0 00:44 pts/1 00:00:00 ./test_prctl
7759 7758 2 00:44 pts/1 00:00:00 /usr/bin/gst-launch-0.10 -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=3
7763 3751 0 00:44 pts/3 00:00:00 ps -ef
2)用sh执行脚本的结果
7787 2361 0 00:45 pts/1 00:00:00 ./test_prctl
7788 7787 0 00:45 pts/1 00:00:00 /bin/sh -c gst-launch -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1
7789 7788 2 00:45 pts/1 00:00:00 /usr/bin/gst-launch-0.10 -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=3
7794 3751 0 00:45 pts/3 00:00:00 ps -ef
4、上述结果会有什么影响呢?
我在C语言中想用kill函数结束/usr/bin/gst-launch-0.10这个进程,在bash脚本这个源代码中很容易用getpid获得/usr/bin/gst-launch-0.10的pid,而在sh的脚本这个源代码中用getpid只能得到/bin/sh -c gst-launch -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1这个东西的pid