C语言中用execl 函数调用bash 和sh执行脚本的区别

为了简化编程,有时候需要通过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

添加新评论