popen 使用方法和kill功能描述

转http://blog.csdn.net/stone8761/article/details/77498439

[ KILL ]功能描述: 转 https://www.cnblogs.com/leeming0222/articles/3994125.html
用于向任何进程组或进程发送信号。

头文件用法:


#include <sys/types.h>
 
#include <signal.h>

int kill(pid_t pid, int sig);
 

 

参数: 
pid:可能选择有以下四种

1. pid大于零时,pid是信号欲送往的进程的标识。
2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4. pid小于-1时,信号将送往以-pid为组标识的进程。

sig:准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行。


返回值说明: 成功执行时,返回0。失败返回-1,errno被设为以下的某个值 EINVAL:指定的信号码无效(参数 sig 不合法) EPERM;权限不够无法传送信号给指定进程 ESRCH:参数 pid 所指定的进程或进程组不存在

popen()可以执行shell命令,并读取此命令的返回值;  

     popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。可以通过这个管道执行标准输入输出操作。这个管道必须由pclose()函数关闭,必须由pclose()函数关闭,必须由pclose()函数关闭而不是fclose()函数(若使用fclose则会产生僵尸进程)。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。

 type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入。

  command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。

  popen()的返回值是个标准I/O流,必须由pclose来终止。前面提到这个流是单向的(只能用于读或写)。向这个流写内容相当于写入该命令的标准输入,命令的标准输出和调用popen()的进程相同;与之相反的,从流中读数据相当于读取命令的标准输出,命令的标准输入和调用popen()的进程相同。

返回值

  如果调用fork()或pipe()失败,或者不能分配内存将返回NULL,否则返回标准I/O流。popen()没有为内存分配失败设置errno值。如果调用fork()或pipe()时出现错误,errno被设为相应的错误类型。如果type参数不合法,errno将返回EINVAL。

 

函数原型

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

例:

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <string.h>  
  5.   
  6. void  
  7. print_result(FILE *fp)  
  8. {  
  9.         char buf[100];  
  10.   
  11.         if(!fp) {  
  12.                 return;  
  13.         }  
  14.         printf("\n>>>\n");  
  15.         while(memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf) - 1, fp) != 0 ) {  
  16.                 printf("%s", buf);  
  17.         }  
  18.         printf("\n<<<\n");  
  19. }  
  20.   
  21. int  
  22. main(void)  
  23. {  
  24.         FILE *fp = NULL;  
  25.   
  26.         while(1) {  
  27.                 fp = NULL;  
  28.                 fp = popen("ls""r");  
  29.                 if(!fp) {  
  30.                         perror("popen");  
  31.                         exit(EXIT_FAILURE);  
  32.                 }  
  33.                 print_result(fp);  
  34.                 pclose(fp);  
  35.                 sleep(1);  
  36.         }  
  37. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`subprocess.Popen()` 方法可以用于启动一个子进程,并返回一个 Popen 对象,该对象包含了该子进程的信息。 要使用 `communicate()` 方法来与子进程进行交互,可以在启动子进程时指定 `stdout` 和 `stderr` 参数为 `subprocess.PIPE`。然后在调用 `communicate()` 方法时,可以将输入数据作为参数传递给它,并且它会返回子进程的输出和错误信息。 以下是一个示例代码: ```python import subprocess p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() print(out.decode()) ``` 在上面的示例中,`Popen()` 方法启动了一个 `ls -l` 命令,并将其输出重定向到 `stdout` 和 `stderr` 参数所指定的管道。然后,`communicate()` 方法被调用,将子进程的输出和错误信息保存在 `out` 和 `err` 变量中,并打印出了输出。 如果要使用 `select()` 模块来检查子进程是否有数据输出,可以使用 `poll()` 方法来实现。以下是一个示例代码: ```python import subprocess import select p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) while True: # 使用 poll() 方法检查子进程是否有数据输出 if p.poll() is not None: break # 使用 select() 方法检查子进程的输出管道是否有数据可读 rlist, wlist, xlist = select.select([p.stdout], [], [], 0.1) # 如果有数据可读,就读取并打印输出 if rlist: data = rlist[0].read() print(data.decode()) ``` 在上面的示例中,使用 `poll()` 方法检查子进程是否已经结束,如果已经结束则退出循环。然后使用 `select()` 方法检查子进程的输出管道是否有数据可读,如果有则读取并打印输出。注意,`select()` 方法的第四个参数表示等待的时间,这里设置为 0.1 秒,表示每 0.1 秒检查一次是否有数据可读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值